Отладка «Строковые или двоичные данные будут обрезаны» ошибка в nHibernate - PullRequest
2 голосов
/ 03 ноября 2010

Я отлаживаю прерывистую ошибку усечения в моем приложении.Ошибка в моих журналах выглядит следующим образом:

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
}

Ответы [ 5 ]

6 голосов
/ 20 сентября 2012

В большинстве случаев это string or binary data truncated.... происходит от Nhibernate Исключение Ado, когда в подаваемых данных содержится больше символов, чем длина поля. например если поле базы данных таблицы nvarchar(50), но предпринимается попытка вставить более 50 символов, возникает это исключение. Решение состоит в том, чтобы либо увеличить длину поля таблицы Db, либо уменьшить количество вставляемых символов данных.

2 голосов
/ 03 ноября 2010

Вы можете настроить IPreInsertEventListener, который просматривает свойства строки перед вставкой, проверяя их длину.

Если одно из свойств слишком длинное, вы можете записать имя свойства и его значение.

2 голосов
/ 03 ноября 2010

Вы можете настроить 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>

В этом случае я отправляю его в окно отладки.

1 голос
/ 03 ноября 2010

Возможно, вы сможете выполнить детализацию и выяснить, что она делает с nHibernate Profiler .

0 голосов
/ 17 апреля 2018

Лучшим решением, по-видимому, является прослушиватель событий, который проверяет значения, используемые в SQL (он работает независимо от БД, даже с SQLite, который игнорирует ограничения длины).Я написал сообщение в блоге с описанием, как реализовать такой слушатель https://cezarypiatek.github.io/post/validate-fields-in-nhibernate-model/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...