在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>
答案 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查询。