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

使用NLog向数据库写入当前时间时遇SqlDateTime溢出错误求助

问题:NLog写入数据库时触发SqlDateTime溢出错误

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

我用DateTime.Now获取当前时间,终端打印的日期格式完全正确,但用NLog写入数据库时一直报上面的溢出错误,试了各种方法都解决不了。

控制器代码

var modificationDate = new SqlDateTime(DateTime.Now);

// 创建LogEventInfo
var logEvent = new LogEventInfo(NLog.LogLevel.Info, logger.Name, "用户{UserID}的权限已修改");
logEvent.Properties["UserID"] = userID;
logEvent.Properties["currentUser"] = currentUser;
logEvent.Properties["ModificationDate"] = modificationDate;
logEvent.Properties["UserGroups"] = string.Join(",", groups);

NLog.config配置片段

<parameter name="@util" layout="${event-properties:UserID}" dbType="String" size="50" />
<parameter name="@modif_par" layout="${event-properties:currentUser}" dbType="String" size="50" />
<parameter name="@date_modif" layout="${longdate:universalTime=true}" dbType="datetime" />
<parameter name="@acces_modif" layout="${event-properties:UserGroups}" dbType="String" />

解决方案

问题出在配置和代码的不匹配:你在代码里生成了正确的modificationDate并添加到日志事件属性中,但NLog配置里的@date_modif字段根本没用到这个属性,而是用了${longdate:universalTime=true}渲染日志事件的默认创建时间。这个渲染器输出的字符串格式可能不符合SQL Server datetime类型的解析要求,导致被识别为无效时间,触发溢出错误。

有两种解决方式:

方式1:直接使用代码中传入的时间属性

修改NLog配置,把@date_modif的layout改成你传入的ModificationDate属性:

<parameter name="@date_modif" layout="${event-properties:ModificationDate}" dbType="datetime" />

同时代码里可以去掉SqlDateTime的包装,直接传入DateTime即可,NLog会自动处理类型转换:

// 无需包装成SqlDateTime,直接用UTC时间更稳妥
logEvent.Properties["ModificationDate"] = DateTime.UtcNow;

方式2:修正longdate的格式输出

如果坚持用日志事件的默认时间,修改longdate为符合SQL要求的格式,比如:

<parameter name="@date_modif" layout="${date:format=yyyy-MM-dd HH:mm:ss:universalTime=true}" dbType="datetime" />

用${date}渲染器指定明确的格式,避免因字符串格式问题导致SQL解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:27:45