【问题标题】:NLog - Parameters not passed to query when writing to databaseNLog - 写入数据库时​​未传递给查询的参数
【发布时间】:2017-11-30 09:11:17
【问题描述】:

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

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

这是我的数据库表:

我的问题是,只有当我不将任何参数传递给插入语句时,我才能将错误写入数据库(这是非常没用的)。也就是说,我的 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”插入到数据库字段中。

我看不出我对示例所做的任何不同之处,因此我们将不胜感激。

问候,

亚历克斯

【问题讨论】:

  • 只是出于兴趣,您是否尝试过将parameter 定义移到commandText 定义之上?
  • 只是猜测,但您是否尝试过&lt;parameter name="message" 而不是"@message"? Nlog 可能会自动添加@。
  • 您是否尝试过暂时删除 MAX 并用文字替换并更改为 INSERT INTO .. (blah) VALUES (blah, @Message);与 Sql Server 相比,SqlCe 有很多限制和怪癖,因此可能值得在可能的情况下进行简化。
  • @pmcilreavy。是的,这似乎有效。不知道为什么我没有想到这一点。

标签: c# nlog


【解决方案1】:

根据@pmcilreavy 的评论

您是否尝试过暂时删除 MAX 并用文字替换并更改为 INSERT INTO .. (blah) VALUES (blah, @Message);与 Sql Server 相比,SqlCe 有很多限制和怪癖,因此可能值得在可能的情况下进行简化。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多