2009-12-23 46 views
8

Tôi đang sử dụng log4net với AdoNetAppender. Nó ghi lại tất cả thông tin nhật ký vào một bảng. Bảng này thực sự có 2 cột Integer (có thể là null).Giá trị mặc định cho thông số AdoNetAppender

Dưới đây là phần có liên quan của cấu hình log4net tôi:

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

gì tôi phát hiện ra là nếu tôi không rõ ràng thiết lập sử dụng một cái gì đó giống như log4net.ThreadContext.Properties["DealID"] = DealID; nó ném cho tôi một ngoại lệ:

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: 

Tôi sẽ phải đặt nó như:

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

Có anyway mà tôi có thể thiết lập một giá trị tham số mặc định trong cấu hình log4net của tôi cho trường Int32 này để tôi không cần phải đặt nó rõ ràng là 0 nếu không có giá trị được cung cấp? Và nó làm cho tôi tự hỏi tại sao nó không xảy ra với các lĩnh vực được thiết lập như varchar (mặc dù không có giá trị được cung cấp cho họ).

Trả lời

27

Thay đổi appender của bạn:

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

Và để cung cấp tín dụng, tôi thấy nó from this thread. (Và một loạt các tìm kiếm khác đang cố gắng làm điều tương tự.

Các vấn đề liên quan