簡體   English   中英

在nHibernate中調試“字符串或二進制數據將被截斷”錯誤

[英]Debug “String or binary data would be truncated” error in 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
}

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

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

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

您可以配置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>

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

您可以深入了解並了解它使用nHibernate Profiler所做的工作。

最好的解決方案似乎是事件監聽器,它驗證SQL中使用的值(它獨立於DB工作,即使SQLite忽略了長度約束)。 我寫了一篇博客文章,描述了如何實現這樣的監聽器https://cezarypiatek.github.io/post/validate-fields-in-nhibernate-model/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM