c# - NLog - 数据库配置 - 德国 SQL Server 上的异常 - 任何想法如何解决?

标签 c# .net nlog

背景

我正在使用 NLog 2.0.1 版,我相信这是最新版本,来自 .Net 4.0 控制台应用程序(使用 Visual Studio 2012 编写)。

应用程序很简单:

namespace NLogConsoleApplication
{
    class Program
    {
        static void Main()
        {
            NLog.LogManager.GetCurrentClassLogger().Info("A testypoos");
        }
    }
}

我有以下 NLog.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true"
      autoReload="true"  
      internalLogFile="C:\Users\Public\nlog.txt"
      internalLogLevel="Debug">
  <targets>    
    <target type="Database" name="tl" >
        <connectionString>data source=.\;initial catalog=NLogTest;integrated security=false;User ID=iwillnotfallforthisone;Password=goodtry</connectionString>
        <commandText>
          insert into TestLog2 ([LogDate], [LogLevel], [LogMessage]) values (@logDate, @logLevel, @logMessage);
        </commandText>
        <parameter name="@logDate" layout="${date}"/>
        <parameter name="@logLevel" layout="${level}"/>
        <parameter name="@logMessage" layout="${message}"/>
    </target>
  </targets>
  <rules>    
    <logger name="*" minlevel="Trace" writeTo="tl" />
  </rules>
</nlog>

TestLog2 表是这样创建的:

CREATE TABLE [dbo].[TestLog2](
    [LogId] [bigint] IDENTITY(1,1) NOT NULL,
    [LogDate] [datetime] NOT NULL,
    [LogLevel] [nvarchar](20) NOT NULL,
    [LogMessage] [nvarchar](max) NOT NULL,
 CONSTRAINT [PK_TestLog2] PRIMARY KEY CLUSTERED 
(
    [LogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

当我运行应用程序时,我得到了这个异常(我用谷歌翻译了这个 - 希望它是可以理解的):

Unhandled Exception: NLog.NLogRuntimeException: Exception occurred in NLog --- > System.Data.SqlClient.SqlException:During the conversion of a nvarchar data type to a datetime data type, the value is out of range.
The statement has been terminated.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent)
   at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent)
   at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent)
   --- End of inner exception stack trace ---
   at NLog.LoggerImpl.<>c__DisplayClass1.<Write>b__0(Exception ex)
   at NLog.Internal.SingleCallContinuation.Function(Exception exception)
   at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent)
   at NLog.Targets.Target.WriteAsyncLogEvent(AsyncLogEventInfo logEvent)
   at NLog.LoggerImpl.WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead, LogEventInfo logEvent, AsyncContinuation onException)
   at NLog.LoggerImpl.Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory)
   at NLog.Logger.Info(String message)
   at NLogConsoleApplication.Program.Main() in c:\xxxxxxx\Program.cs:Line 7.

如果我将 LogDate 列更改为 nvarchar,它可以正常工作,但我真的不希望该列是一个字符串,因为我希望能够根据日期对表进行排序和搜索。

注意事项

  • 我在德语版的 Windows Server 2008 R2 标准上运行它,连接到德语版的 SQL Sever 2012。
  • 如果我连接到英语 SQL Server 2012 实例,它工作正常。
  • 我检查了 nlog.txt 文件,里面似乎没有更多信息(只是相同的异常跟踪)

问题

也许这只是 NLog 中的一个错误,或者它只是一个我可以更改的配置,或者有一个聪明的解决方法,所以有人知道我如何让 NLog 放置一个DateTime 到我的数据库中获取时间戳?

最佳答案

我猜想来自 NLog 的 datetime 的格式是 MM/dd/yyyy 而德国 SQL Server 期待 dd/MM/yyyy。您可以明确指定日期格式:

<parameter name="@logDate" layout="${date:format=yyyy-MM-dd}"/>

SQL Server 应该能够解析日期并适本地插入它,而不管期望 MM/dddd/MM 的语言环境。

A similar question

NLog Documentation

关于c# - NLog - 数据库配置 - 德国 SQL Server 上的异常 - 任何想法如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17163679/

相关文章:

c# - httpclient async/await 与否

c# - Xamarin Android 警报管理器问题

c# - enum bitwise/flags 实例枚举/迭代/foreach

visual-studio-2012 - 保留 namespace 前缀的转换

NLog 与 DNX Core 5.0

c# - 将控件的可见性绑定(bind)到 IEnumerable 的 'Count'

c# - AutoFac - 在 app_start 上初始化重量级单例

c# - 如何使用 GetFolderPath 获取自定义文件夹路径?

.net - 使用 Exchange Web 服务发送带有特殊字符的电子邮件

asp.net - 如何使用身份验证通过 NLog 或 SeriLog 登录到 Elastic Search