2011-03-06 47 views
8

在C#Web应用程序中使用NLog时,我使用存储过程而不是SQL INSERT语句存在一些问题。连接字符串“Logger”在Web.config中正确配置,并且在用SQL语句替换commandText时正常工作。我希望向正确的方向提示。在这个例子中,存储过程在“日志”模式下,它被称为“LogError”。在数据库目标上的NLog中使用存储过程

<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> 

回答

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" 

旁注:克劳斯Rathje的答案不会在浏览器中呈现,所以我不得不寻找一个在页面源查看他发布的配置。

+0

谢谢,这个伎俩。我没有想到我可以致电exec。它在内部调用sp_executesql – Diego 2011-03-08 20:49:01

+0

@adrift到NLog论坛帖子的链接现在是多余的。 – chridam 2014-03-21 15:51:22

1

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

你可以做这样的事情,而不是:

commandText="AddActivityLog" 
commandType="StoredProcedure" 

这样,你不必有关正确格式化担心的EXEC查询。

+0

需要传递的参数呢? – JoshYates1980 2016-02-19 17:17:11

相关问题