使用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
相关产品推荐
相关产品推荐

