2009-01-08 6 views
7

Bir guid olan özel bir özellik eklemek çalışıyorum ama bana bu hata veriyor: Ben config bu belirtmekkullanma uniqueidentifiers/log4net özel özellikleri gibi guid

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

:

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

Herhangi bir yardım edin:

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

gerçek kod (snippet) i kullanmak bu nedir? :) Veritabanındaki id alanı benzersiz bir tanımlayıcı NOT NULL olarak tanımlanmıştır, ancak birincil anahtar kontrole sahip değildir. senin Örneğin

+0

Neden bir rehber istiyorsun? Bu bir çeşit bağlam sağlamak mı? –

cevap

22

şu çalışmalıdır:

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

Önemli sen dizeleri eklemek çalışsanız bile aksi takdirde veritabanında boş değerler elde edecek başka bir şey @id adlandırmak olduğunu

Sonra saklamak için RawPropertyLayout kullanın, bir dönüşüm yapmanız gerekmez.

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

sonra çalışır:

+1

Netlik için, LoggingEvent Properties koleksiyonunda aranacak değerin adıdır. – bluedot

0

1. log4.net

kaynak kodunu

2. değiştirme fonksiyonu böyle dosyasına log4net.Appender.AdoNetAppender.cs içeride FormatValue indirin!