2009-01-08 10 views
7

Je suis en train d'ajouter une propriété personnalisée qui est un guid, mais il me donne cette erreur:Utilisation uniqueidentifiers/GUIDs comme des propriétés personnalisées dans log4net

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

Je précise cela dans la config:

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

Le code réel (extrait) i utiliser est la suivante:

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

Toute aide s'il vous plaît? :) Le champ id dans la base de données est défini comme un identifiant unique NOT NULL, mais il n'a pas la contrainte de clé primaire.

+0

pourquoi voulez-vous un guid? Est-ce pour fournir une sorte de contexte? –

Répondre

22

Pour votre exemple les éléments suivants devraient fonctionner:

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

Important vous est renommé @id à quelque chose d'autre, sinon vous obtiendrez des valeurs NULL dans la base de données même si vous essayez d'insérer des chaînes,

Et puis utilisez RawPropertyLayout pour stocker, vous n'avez pas besoin de faire une conversion.

+1

Pour plus de clarté, est le nom de la valeur à rechercher dans la collection LoggingEvent Properties. – bluedot

0

1. télécharger le code source de log4.net

2. Modifier la fonction FormatValue dans le fichier log4net.Appender.AdoNetAppender.cs comme ceci:

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

il fonctionne!