Должен ли я сказать NHibernate / FNH явно использовать строковый тип данных для параметра, сопоставленного со строковым столбцом? - PullRequest
1 голос
/ 08 декабря 2009

Моя когорта строит несколько длинный поисковый запрос, основанный на различных входных данных от пользователя. У нас есть NHibernate с использованием Fluent NHibernate, и, кроме некоторых ошибок noob, кажется, что все идет хорошо.

Одна проблема, которую мы не можем решить в случае этого поиска, заключается в том, что для определенного параметра NHibernate создает sql, который обрабатывает ввод как int, когда нам явно требуется, чтобы он был строкой. У нас есть строковое свойство, сопоставленное столбцу nvarchar (255), который в основном содержит целые числа, за исключением некоторых произвольных входных данных, таких как «временные» или длинных чисел, таких как 4444444444444444, которые выходят за пределы int.

В ходе тестирования я видел пару вещей: 1) Если я добавляю 0 к входящему значению, NH генерирует параметр sql в виде строки, соответственно; 2) Если значение реально может быть преобразовано в целое число, результирующий SQL обрабатывает его так. В случае № 2, если я запускаю сгенерированный sql напрямую через сервер sql, я получаю исключение, когда в запросе встречается нецелочисленное значение (например, примеры, которые я перечислил выше). По какой-то причине, когда я просто позволяю NH сделать это, я получаю соответствующие записи обратно, но это не имеет смысла; Я ожидал, что это не получится, или, по крайней мере, скажу, что что-то не так с некоторыми записями, которые не могут быть оценены SqlServer.

Отображение простое, хранилище данных простое; Я был бы в порядке, оставив достаточно хорошо в одиночестве, если бы я хотя бы понял, почему / как NHibernate делает эту работу, когда запуск одного и того же состояния вручную дает сбой ... Есть мысли?

1 Ответ

1 голос
/ 08 декабря 2009

Вы запускаете точно такой же код непосредственно в SQL Server?

NHibernate параметризует все свои запросы и при этом определяет, какое значение передается в SQL в параметрах. Вероятно, это то, о чем вы спрашиваете, причина, по которой SQL терпит неудачу, заключается в том, что по умолчанию он будет знать разницу, только если вы введете:

select * from table_name
   where col_name = 5

по сравнению с

select * from table_name
   where col_name = '5'

Если вы не определили его как строку с символами 's', он будет искать int и попытаться преобразовать все varchar-ы в int, которые в некоторых случаях, очевидно, не будут работать со строками.

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