AdoNetAppender参数的默认值

10

我正在使用log4net和AdoNetAppender。它将所有日志信息记录到一个表中。这个表实际上有两个整数列(可以为空)。

下面是我的log4net配置的相关部分:

<commandText value="INSERT INTO ActivityLog ([Date],[Thread],[Level],[Logger],[Message],[DealID]) 
                 VALUES (@log_date,@thread,@log_level,@logger,@message,@DealID)" />

 //other parameters hten DealID
<parameter>
      <parameterName value="@DealID" />
      <dbType value="Int32" />
       <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{DealID}" />
      </layout>
    </parameter>
我发现如果不显式地设置类似 log4net.ThreadContext.Properties["DealID"] = DealID; 这样的东西,它就会抛出异常:
System.FormatException occurred
  Message="Failed to convert parameter value from a String to a Int32."
  Source="System.Data"
  StackTrace:
       at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
  InnerException: System.FormatException
       Message="Input string was not in a correct format."
       Source="mscorlib"
       StackTrace:
            at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
            at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
            at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
            at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
            at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
       InnerException: 

我需要这样设置:

log4net.ThreadContext.Properties["DealID"] = 0;

有没有办法在我的log4net配置中为这个Int32字段设置默认参数值,这样如果没有提供值,我就不需要明确地将它设置为0呢?这让我想知道为什么varchar类型的字段却不会发生这种情况(即使它们没有提供值)。

1个回答

29

更改您的日志附加器:

<parameter>
    <parameterName value="@DealID" />
    <dbType value="Int32" />
    <layout type="log4net.Layout.RawPropertyLayout">  <!-- notice this -->
        <key value="DealID" />  <!-- and notice this instead of the pattern layout -->
    </layout>
</parameter>

为了表示感谢,我在这个帖子中找到它。(还有很多其他搜索尝试做同样的事情。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接