2009-12-23 15 views
8

Ich benutze log4net mit AdoNetAppender. Es protokolliert alle Protokollinformationen in einer Tabelle. Diese Tabelle hat tatsächlich 2 Ganzzahlspalten (kann null sein).Standardwerte für AdoNetAppender Parameter

Hier ist der relevante Teil meiner log4net config:

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

Was ich fand, war, wenn ich nicht ausdrücklich etwas wie log4net.ThreadContext.Properties["DealID"] = DealID; gesetzt verwenden es wirft mich eine Ausnahme:

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: 

ich würde es gesetzt haben, wie:

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

Gibt es trotzdem, dass ich einen Standard-Parameter-Wert in meiner log4net-Konfiguration für dieses Int32-Feld festlegen kann, so dass ich es nicht explizit auf 0 setzen muss, wenn kein Wert angegeben wird? Und ich frage mich, warum es nicht zu Feldern kommt, die als varchar gesetzt sind (obwohl ihnen kein Wert zugewiesen wird).

Antwort

27

Ihre appender ändern:

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

Und Kredit zu geben, fand ich es from this thread. (Und ein paar andere Leute, die versuchen, dasselbe zu tun.

Verwandte Themen