Frage

Ich versuche, eine benutzerdefinierte Eigenschaft hinzufügen, die eine GUID ist, aber es gibt mir diese Fehlermeldung:

  

System.InvalidCastException: Fehler beim   Parameterwert aus einem String konvertieren   zu einem Guid. --->   System.InvalidCastException: Ungültige   Umwandlung von ‚System.String‘ zu   'System.Guid'.

ich geben Sie dies in der config:

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

Der eigentliche Code (Snippet) i verwenden, ist dies:

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

Jede Hilfe bitte? :) Das ID-Feld in der Datenbank als ein Unique NOT NULL definiert ist, aber es hat nicht den Primärschlüssel contraint.

War es hilfreich?

Lösung

Für Ihr Beispiel soll die folgenden Arbeiten:

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

Wichtig ist, dass Sie @id etwas umbenennen sonst sonst werden Sie sogar Null-Werte in der Datenbank erhalten, wenn Sie versuchen, Zeichenketten einzufügen,

Und dann RawPropertyLayout verwenden zu speichern, cus Sie convertion nicht tun müssen.

Andere Tipps

1. Laden Sie den Quellcode von log4.net

2 Ändern Sie die Funktion FormatValue in der Datei log4net.Appender.AdoNetAppender.cs wie folgt aus:.

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

dann funktioniert es!

Wenn Sie eine Allzweck- GUID Eigenschaft erhalten möchten, können Sie wie folgt vor:

    private void ConfigureLog4Net()
    {
        // adds a global custom log4net property
        log4net.GlobalContext.Properties[nameof(Guid.NewGuid)] = new NewGuidWrapper();

        // configures log4net by XML configurations from a .config file
        log4net.Config.XmlConfigurator.Configure();
    }

    private class NewGuidWrapper
    {
        // will return new GUID every time it's called
        public override string ToString() => Guid.NewGuid().ToString();
    }

und dann können Sie die Eigenschaft auf folgende Weise aufrufen:

<layout type="log4net.Layout.PatternLayout">
  <!-- if you want to format the layout as a GUID followed by a message  -->
  <conversionPattern value="%property{NewGuid} %m%n" />
</layout>

Sie können auch diese Art von Layout für einen benutzerdefinierten DB-Parameter verwenden, wie es hier beschrieben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top