You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 8 Web API迁移后DateTime格式化引发SQL转换错误

解决方案

核心问题

服务器上的文化设置虽然和本地显示一致,但实际的月份缩写格式(比如Jun. vs Jun)存在差异,导致生成的日期字符串不符合SQL Server的datetime转换要求。由于你没有显式配置应用的文化,ASP.NET Core会默认使用服务器系统的当前文化,而这个文化的月份缩写规则和本地不一致。

配置Program.cs统一文化格式

你可以在Program.cs中全局配置应用的默认文化,强制使用月份缩写不带点的文化(比如en-US),这样所有DateTime.ToString("d MMM yyyy")的调用都会统一生成不带点的格式:

var builder = WebApplication.CreateBuilder(args);

// 配置全局请求本地化,指定默认文化
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var targetCulture = "en-US"; // 根据你的业务需求选择合适的文化
    var cultureInfo = new CultureInfo(targetCulture);
    
    options.DefaultRequestCulture = new RequestCulture(cultureInfo);
    options.SupportedCultures = new List<CultureInfo> { cultureInfo };
    options.SupportedUICultures = new List<CultureInfo> { cultureInfo };
});

// 其他服务注册(比如AddControllers等)...

var app = builder.Build();

// 启用本地化中间件,必须放在路由相关中间件之前
app.UseRequestLocalization();

// 其他中间件配置(比如UseAuthorization、MapControllers等)...

app.Run();

如果你的业务需要支持多文化,但特定场景下需要统一日期格式,也可以单独为DateTime设置自定义格式化规则,但全局统一文化的方式更简洁,能避免其他地方出现类似的格式问题。

额外建议(根本解决)

尽量不要将DateTime转换为字符串拼接SQL语句,改用参数化查询(比如Entity Framework Core的LINQ查询,或者SqlCommand的参数)。这样不仅能彻底避免日期格式转换问题,还能防止SQL注入,是更安全、更规范的做法。比如:

// 示例:用参数化查询替代字符串拼接
using var command = new SqlCommand("SELECT * FROM Orders WHERE OrderDate >= @StartDate", connection);
command.Parameters.AddWithValue("@StartDate", DateTime.Today.AddMinutes(1));

内容的提问来源于stack exchange,提问作者Ross Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:16:02