NHibernate DateTime для запроса, исключение переполнения, вызванное форматом строки - PullRequest
0 голосов
/ 18 февраля 2011

NHibernate генерирует следующий SQL, который не поддерживается Firebird;

where  (struct_cas0_.DELETED IS NULL)
       and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */
       and struct_cas0_.DATE_RECORD <= '2005-01-01T00:00:00.00' /* @p1 */
       and struct_cas0_.DATE_RECORD >= '2006-12-31T00:00:00.00' /* @p2 */

Приведенный выше SQL завершается ошибкой в ​​Firebird с ошибкой «При преобразовании типов данных произошло переполнение. Ошибка преобразования из строки '2005-01-01T00: 00: 00.00'"

Если мы удалим 'T' из запроса, Firebird выполнит запрос без проблем;

where  (struct_cas0_.DELETED IS NULL)
       and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */
       and struct_cas0_.DATE_RECORD <= '2005-01-01 00:00:00.00' /* @p1 */
       and struct_cas0_.DATE_RECORD >= '2006-12-31 00:00:00.00' /* @p2 */

Есть ли способ, которым мы можем заставить NHibernate удалить 'T' при преобразовании DateTime в запрашиваемую строку?

Дополнительный вопрос теперь поднимается после некоторого исследования. Похоже, что FireBird не поддерживает комбинированный формат даты и времени. Формат DateTime (ISO8601) http://en.wikipedia.org/wiki/ISO_8601 с символом разграничения времени («T»). Можно ли это подтвердить, так как я не понимаю, почему база данных не поддерживает такой стандартный (сортируемый) формат даты?

Если буква «Т» пропущена, дата поддерживается.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2011

Формат DateTime себя в строку.http://msdn.microsoft.com/en-us/library/az4se3k1(v=VS.100).aspx

Также я думаю, что формат DateTime, создаваемый Nhibernate, может зависеть от региональных настроек.Попробуйте изменить культуру потока.

Попробуйте выполнить чистую команду ADO.NET из NHConnection с параметром DateTime, чтобы проверить, не является ли драйвер FireBird .ADO мешающим формату DateTime с культурой.ISession.Connection.CreateCommand ()

NHibernate должен использовать параметризованный Ado.net IDbCommand, поэтому вряд ли это проблема Nhibernate.Я не думаю, что Nhibernate отформатирует вашу дату и время в любом месте своего кода, по крайней мере, не должен.

0 голосов
/ 18 февраля 2011

NHibernate не конвертирует параметры в строки; это ответственность провайдера ADO.NET.

Попробуйте следующее:

var connection = new FbConnection(theConnectionString);
var command = connection.CreateCommand();
var parameter = command.CreateParameter();
command.CommandText = "select something from that_table where date_record = @p";
parameter.Name = "p";
parameter.Value = DateTime.Today;
command.Parameters.Add(parameter)
connection.Open();
command.ExecuteReader();

Если это не удастся, есть ваша ошибка

0 голосов
/ 18 февраля 2011

Вы уверены, что у вас правильный драйвер и т. Д. По этому вопросу Как настроить NHibernate с Visual Studio и Firebird? ?

Кроме того, убедитесь, какой тип данных у васесть в БД и в отображении.Они точно такие же?(например, оба не обнуляются)?

В противном случае, это может быть ошибка в самом NHibernate.Лучшим решением будет обновление до NHibernate 3.0 (или более поздней версии магистрали, не волнуйтесь, они обычно стабильны).Если это по-прежнему ошибка, создайте проблему с JIRA, и она может быть быстро исправлена.

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