Dot-Net
在 log4net 中使用 uniqueidentifiers/guids 作為自定義屬性
我正在嘗試添加一個自定義屬性,它是一個 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 欄位被定義為唯一標識符 NOT NULL,但它沒有主鍵約束。
對於您的範例,以下內容應該有效:
<parameter> <parameterName value="@Oid" /> <dbType value="Guid" /> <layout type="log4net.Layout.RawPropertyLayout"> <key value="Id" /> </layout> </parameter>重要的是您將@id 重命名為其他名稱,否則即使您嘗試插入字元串,您也會在數據庫中獲得 Null 值,
然後使用 RawPropertyLayout 來儲存,因為你不需要做轉換。
**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; } }那麼它的工作原理!