9

GUIDであるカスタムプロパティを追加しようとしていますが、次のエラーが発生します。

System.InvalidCastException:パラメーター値を文字列からGUIDに変換できませんでした。---> System.InvalidCastException:「System.String」から「System.Guid」へのキャストが無効です。

私はこれを設定で指定します:

<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として定義されていますが、主キーの制約はありません。

4

3 に答える 3

24

あなたの例では、次のように動作するはずです:

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

@id の名前を別の名前に変更することが重要です。そうしないと、文字列を挿入しようとしても、データベースに Null 値が返されます。

そして、RawPropertyLayout を使用して保存します。変換を行う必要はありません。

于 2009-01-08T13:12:52.913 に答える
0

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

それは動作します!

于 2014-08-20T09:16:02.983 に答える