2009-12-23 6 views
8

J'utilise log4net avec AdoNetAppender. Il enregistre toutes les informations de journal dans une table. Cette table a réellement 2 colonnes entières (peuvent être nulles).Valeurs par défaut pour le paramètre AdoNetAppender

Voici la partie pertinente de ma 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> 

Ce que j'ai découvert était si je ne mets pas explicitement d'utiliser quelque chose comme log4net.ThreadContext.Properties["DealID"] = DealID; il me renvoie une exception:

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: 

Je devrais le mettre comme:

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

Est-il possible de définir une valeur de paramètre par défaut dans ma configuration log4net pour ce champ Int32 de sorte que je n'ai pas besoin de le mettre explicitement à 0 si aucune valeur n'est fournie? Et je me demande pourquoi cela n'arrive pas aux champs qui sont définis comme varchar (bien qu'aucune valeur ne leur soit fournie).

Répondre

27

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

Et pour donner crédit, je l'ai trouvé from this thread. (Et un tas d'autres recherches essayant de faire la même chose.)

Questions connexes