Значения по умолчанию для параметра AdoNetAppender - PullRequest
9 голосов
/ 23 декабря 2009

Я использую log4net с AdoNetAppender. Он записывает всю информацию журнала в таблицу. Эта таблица на самом деле имеет 2 целочисленных столбца (может быть нулевым).

Вот соответствующая часть моей конфигурации 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 Ответ

28 голосов
/ 10 января 2011

Измените свой аппендир:

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

И чтобы отдать должное, я нашел его из этой темы . (И куча других поисков пытаются сделать то же самое.

...