2009-12-23 24 views
8

मैं AdoNetAppender के साथ log4net का उपयोग कर रहा हूं। यह सभी लॉग जानकारी को एक तालिका में लॉग करता है। इस तालिका में वास्तव में 2 इंटीजर कॉलम हैं (शून्य हो सकते हैं)।AdoNetAppender पैरामीटर के लिए डिफ़ॉल्ट मान

यहाँ मेरी 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> 

क्या मुझे पता चला था कि अगर मैं स्पष्ट रूप से 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;

क्या वैसे भी है कि मैं इस Int32 फ़ील्ड के लिए अपने log4net कॉन्फ़िगरेशन में डिफ़ॉल्ट पैरामीटर मान सेट कर सकता हूं ताकि मुझे कोई मान प्रदान न होने पर इसे स्पष्ट रूप से 0 पर सेट करने की आवश्यकता न हो? और यह मुझे आश्चर्यचकित करता है कि यह उन क्षेत्रों के साथ क्यों नहीं होता है जो वर्चर के रूप में सेट होते हैं (हालांकि उन्हें कोई मूल्य प्रदान नहीं किया जाता है)।

उत्तर

27

अपने 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 पाया। (और एक ही चीज करने की कोशिश कर रहे अन्य खोजों का एक गुच्छा।

संबंधित मुद्दे