NLog - 写入数据库

时间:2017-11-30 09:11:17

标签: c# nlog

我对NLog很新,所以请原谅我的基本问题。

我继承了一些承包商编写的Winforms应用程序,我主要是一个数据库开发人员,但我设法对应用程序进行了一些开发,但我有时很难跟踪用户遇到的错误消息,因此我我试图通过NLog改进登录到应用程序,我首先在NLog 4.4.5中遇到了问题,我已经更新到4.4.12并且没有解决问题。我已经验证NLog正在正确捕获错误,因为它将输出到文本文件,但是当我尝试将其指向数据库输出时,我无法使其工作。

这是我的数据库表:

SQL Table

我的问题是,只有当我没有将任何参数传递给insert语句时,我才能将错误写入数据库(这是非常无用的)。也就是说我的NLog.config文件中的以下内容有效:

<target name="database" xsi:type="Database">
  <commandText>INSERT INTO [tblException] (DbVersionID, ExceptionDateTime) SELECT MAX(DbVersionID), GETDATE() FROM tblDbVersion</commandText>

  <dbProvider>System.Data.SqlServerCe.4.0</dbProvider>
  <connectionString>Data Source=${basedir}\Database.sdf</connectionString>
</target>

但这并不是':

<target name="database" xsi:type="Database">
   <commandText>INSERT INTO [tblException] (DbVersionID, ExceptionDateTime, Message) SELECT MAX(DbVersionID), GETDATE(), @message FROM tblDbVersion</commandText>

   <parameter name="@message" layout="${message}" />

   <dbProvider>System.Data.SqlServerCe.4.0</dbProvider>
   <connectionString>Data Source=${basedir}\Database.sdf</connectionString>
</target>

我启用了内部日志记录,以下是我得到的内容:

2017-11-28 11:26:45.8063 Trace Executing Text: INSERT INTO [tblException] (DbVersionID, ExceptionDateTime, Message) SELECT MAX(DbVersionID), GETDATE(), @Message FROM tblDbVersion
2017-11-28 11:26:45.8063 Trace   Parameter: '@message' = 'Test Error Message' (String)
2017-11-28 11:26:45.8063 Error Error when writing to database. Exception: System.Data.SqlServerCe.SqlCeException (0x80004005): A parameter is not allowed in this location. Ensure that the '@' sign is in a valid location or that parameters are valid at all in this SQL statement.
   at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
   at System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
   at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
   at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
   at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent)
   at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent)

在查询运行之前,查询似乎没有被替换。我尝试在命令文本中添加单引号,以防万一会有所帮助但只是导致文字字符串'@message'被插入到数据库字段中。

我看不到任何与示例不同的内容,所以任何帮助都会受到赞赏。

此致

亚历

1 个答案:

答案 0 :(得分:0)

根据@pmcilreavy的评论

  

您是否尝试过暂时删除MAX并替换为文字并更改为INSERT INTO ..(等等)VALUES(等等,@ Messess);与Sql Server相比,SqlCe有很多限制和怪癖,因此可能值得尽可能简化。

问题似乎是SQLCE不支持select语句的select部分中的参数。