2010-11-02 44 views
2

我正在調試我的應用程序中的間歇性截斷錯誤。在我的記錄錯誤是這樣的:在nHibernate中調試「字符串或二進制數據將被截斷」錯誤

System.Data.SqlClient.SqlException: String or binary data would be truncated. 
The statement has been terminated. Generated: Tue, 02 Nov 2010 03:55:18 GMT 

NHibernate.Exceptions.GenericADOException: could not insert: 
[DataModel.Product][SQL: INSERT INTO [Product] (Fields) VALUES (?, ?,...); 
select SCOPE_IDENTITY()] ---> 
System.Data.SqlClient.SqlException: String or binary data would be truncated. 
The statement has been terminated.  
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 

注意,誤差不用於拋出錯誤,只是佔位符的SQL提供的參數值:(?, ?,...)。有沒有辦法從nHibernate中獲得這些?就像這樣:

try { 
    ... 
    Session.Flush(); // throws 
} 
catch (GenericADOException ex) { 

    // want to get the bad parameter values, 
    // so I can re-throw a more helpful exception 
} 

回答

1

您可以配置log4net在某處發送NH SQL輸出。例如:

<log4net> 
    <appender name="Debug" type="log4net.Appender.DebugAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL"> 
    <level value="DEBUG"/> 
    <appender-ref ref="Debug"/> 
    </logger> 
</log4net> 

在這種情況下,我將它發送到調試窗口。

2

您可以設置一個IPreInsertEventListener,它在插入之前遍歷字符串屬性,檢查它們的長度。

如果其中一個屬性太長,則可以記錄屬性的名稱及其值。

5

大多數情況下,這個string or binary data truncated....來自Nhibernate當輸入的數據比字段長度更多的字符時,例外。例如如果表db字段爲nvarchar(50),但正在努力插入超過50個字符,則會發生此異常。解決方案是增加表格Db字段長度或減少插入的數據字符。

相關問題