2009-12-23 19 views
8

Estoy usando log4net con AdoNetAppender. Registra toda la información de registro en una tabla. Esta tabla en realidad tiene 2 columnas enteras (puede ser nula).Valores predeterminados para el parámetro AdoNetAppender

Aquí es la parte relevante de mi config 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> 

Lo que descubrí era si yo no establece explícitamente el uso de algo así como log4net.ThreadContext.Properties["DealID"] = DealID; me produce una excepción:

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: 

tendría que configurarlo como:

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

¿Hay alguna forma de que pueda establecer un valor de parámetro predeterminado en mi configuración de log4net para este campo Int32 de modo que no necesite establecerlo explícitamente en 0 si no se proporciona ningún valor? Y me pregunto por qué no sucede con los campos que se configuran como varchar (aunque no se les proporciona ningún valor).

Respuesta

27

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

y para dar crédito, lo encontré from this thread. (Y un montón de otras búsquedas tratando de hacer lo mismo.

Cuestiones relacionadas