我正在使用log4net和AdoNetAppender。它将所有日志信息记录到表中。该表实际上有2个整数列(可以为null)。
以下是我的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的字段中(尽管没有为它们提供任何值)。
答案 0 :(得分:28)
更改你的appender:
<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>
为了表示赞赏,我找到了from this thread。 (以及其他一些试图做同样事情的搜索。