在数据库目标上使用NLog中的存储过程

时间:2011-03-06 22:44:44

标签: c# nlog

在C#Web应用程序中使用NLog时,使用存储过程而不是SQL INSERT语句时遇到了一些问题。连接字符串“Logger”在Web.config中正确配置,并在用SQL语句替换commandText时正常工作。我希望得到正确方向的暗示。在此示例中,存储过程位于“Logs”模式下,称为“LogError”。

<targets>
  <target xsi:type="Database"
      name="dberrorlog"
      connectionStringName="Logger"
      keepConnection="true"   
      commandText="[Logs].[LogError]" >
      <parameter name="@ProgName" layout="MyAppName"/>
      <parameter name="@CompName" layout="${machinename}"/>
      <parameter name="@LogLevel" layout="${level}"/>
      <parameter name="@UserName" layout="${identity}"/>
      <parameter name="@Error" layout="${exception:format=Message}"/>
      <parameter name="@SourceObj" layout="${exception:format=Method}"/>
      <parameter name="@StackTrace" layout="${exception:format=StackTrace}"/>
 </target>
</targets>
<rules>
  <logger name="*" minlevel="Error" writeTo="dberrorlog" />
</rules>

2 个答案:

答案 0 :(得分:10)

从这个NLog forum post,尝试使用该文本来执行存储过程:

commandtext="exec AddActivityLog
                            @ApplicationName, 
                            @ApplicationTime, 
                            @Severity, 
                            @Logger, 
                            @SaxoID, 
                            @EventID, 
                            @Message, 
                            @URL, 
                            @URLReferrer, 
                            @RemoteAddress, 
                            @Callsite, 
                            @CurrentUICulture, 
                            @ThreadIdentity, 
                            @WindowsIdentity, 
                            @MachineName, 
                            @ProcessID, 
                            @ThreadID, 
                            @ThreadName, 
                            @Stacktrace, 
                            @Exception,
                            @Cookie,
                            @FormVariables,
                            @QueryString,
                            @HTTPUserAgent"

旁注:Claus Rathje的答案不会在我的浏览器中呈现,所以我不得不查看页面来源以查看他发布的配置。

答案 1 :(得分:1)

请注意,虽然@ JeffOgata的解决方案有效,但它可能不是您想要解决问题的方式。

你可以这样做:

private static boolean hasColumn (RestultSet rs, String column) {
    RestulSetMetaData md = rs.getMetaData();
    int colCount = md.getColumnCount();
    for (int i = 1; i <= colCount; ++i) { // Note that column indexes are 1-based
        if (column.equalsIgnoreCase(rs.getColumnName(i))) {
            return true;
        }
    }
    return false;
}

这样您就不必担心正确格式化EXEC查询。