2009-01-08 12 views
7

Próbuję dodać właściwość niestandardową, która jest GUID, ale daje mi ten błąd:Korzystanie uniqueidentifiers/GUID jako właściwości niestandardowe w log4net

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

mogę określić to w config:

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

rzeczywisty kod (urywek) używam to:

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

Każda pomoc proszę? :) Pole id w bazie danych jest zdefiniowane jako unikalnyidentyfikator NOT NULL, ale nie ma ono ograniczenia podstawowego.

+0

dlaczego chcesz guid? Czy to zapewnia pewien kontekst? –

Odpowiedz

22

Dla przykładu następujące powinny działać:

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

Ważne jest zmienić nazwę @id do czegoś innego inaczej dostaniesz wartości Null w bazie danych, nawet jeśli starają się wstawić ciągi,

A potem używaj RawPropertyLayout do przechowywania, ale nie musisz robić konwersji.

+1

Dla przejrzystości, to nazwa wartości do wyszukiwania w kolekcji Właściwości LoggingEvent. – bluedot

0

1. Pobierz kod źródłowy log4.net

2. zmienić funkcję FormatValue wewnątrz pliku log4net.Appender.AdoNetAppender.cs tak:

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

to działa!

Powiązane problemy