2009-01-08 51 views
7

我想添加自定義屬性,它是一個GUID,但它給我這個錯誤:使用uniqueidentifiers /的GUID在log4net的自定義屬性

System.InvalidCastException: Failed to convert parameter value from a String to a Guid. ---> System.InvalidCastException: Invalid cast from 'System.String' to 'System.Guid'.

我在config指定此:

<parameter> 
<parameterName value="@id" /> 
<dbType value="Guid" /> 
<layout type="log4net.Layout.PatternLayout"> 
<conversionPattern value="%X{id}" /> 
</layout> 
</parameter> 

的實際代碼(段),我用的是這個:

 Guid guid = Guid.NewGuid(); 
     if (defaultLogger.IsEnabledFor(level)) 
     { 
      var loggingEvent = new LoggingEvent(ThisDeclaringType, 
defaultLogger.Repository, defaultLogger.Name, level, message, exception); 
      loggingEvent.Properties["Id"] = guid; 

任何幫助嗎? :)數據庫中的id字段被定義爲uniqueidentifier NOT NULL,但它沒有主鍵約束。

+0

爲什麼你想要一個GUID?這是否提供某種上下文? – 2009-01-08 13:02:04

回答

22

對於示例下面應該工作:

<parameter> 
<parameterName value="@Oid" /> 
<dbType value="Guid" /> 
<layout type="log4net.Layout.RawPropertyLayout"> 
<key value="Id" /> 
</layout> 
</parameter> 

重要的是,你命名@id到別的東西,否則即使你嘗試插入字符串你會得到數據庫Null值,

然後使用RawPropertyLayout存儲,你不需要做轉換。

+1

爲了清晰起見,是LoggingEvent屬性集合中要查找的值的名稱。 – bluedot 2017-09-18 19:48:11

0

下載log4.net

的源代碼

2.更改功能FormatValue文件log4net.Appender.AdoNetAppender.cs裏面是這樣的:

virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent) 
     { 
      // Lookup the parameter 
      IDbDataParameter param = (IDbDataParameter)command.Parameters[m_parameterName]; 

      // Format the value 
      object formattedValue = Layout.Format(loggingEvent); 

      // If the value is null then convert to a DBNull 
      if (formattedValue == null) 
      { 
       formattedValue = DBNull.Value; 
      } 

      if (param.DbType == System.Data.DbType.Guid) 
      { 
       param.Value = new Guid(formattedValue.ToString()); 
      } 
      else 
      { 
       param.Value = formattedValue; 
      } 
     } 

然後它的作品!