2016-05-27 1 views
1

У меня есть таблица в базе данных, а один из столбцов содержит xml, хранящийся как nvarchar. Мне нужно написать запрос и получить информацию на основе данных, хранящихся в этом столбце.Парсер запроса запроса NHibernate выдает ошибку в выражении '/ * [1]/@ type

Так что я в конечном итоге написание следующей родной запрос SQL, используя NHibernate:

string sql = @"SELECT a.id as s 
    FROM [DBT].[dbo].[tb_myTable] a 
    where (cast (a.vchExtendedInfo as XML)).value('/*[1]/@type','NVARCHAR(MAX)')='deal'" 
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession().CreateSQLQuery(sql) 

И выдает ошибку: «ArgumentOutOfRangeException» - длина не может быть меньше, чем имя zero.Parameter: длина.

После небольшого тестирования я узнал, что NHibernate пытается разобрать мой запрос и что строка '/*[1]/@type', вероятно, является причиной. (Это фактически упрощенный пример, и все остальные условия работают, если я удалю этот).

Итак, как мне избежать/исправить свой запрос, чтобы он работал?

ответ

0

Я думаю, это из-за «@» в запросе.

Вы уже пытались использовать параметры?

string sql = @"SELECT a.id as s 
    FROM [DBT].[dbo].[tb_myTable] a 
    where (cast (a.vchExtendedInfo as XML)).value(:type,'NVARCHAR(MAX)')=:value" 
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession() 
    .CreateSQLQuery(sql) 
    .SetAnsiString("type", "/*[1]/@type") 
    .SetAnsiString("value", "deal"); 
+0

Ну, я потратил немало времени на эту проблему. Я закончил с ошибкой, когда функция xml.value отказалась принять параметр как первое значение и только принятые строковые литералы. Я даже скопировал код, сгенерированный NHibernate, в SQL Studio и попытался заставить его работать там. Последнее полурабочее решение было тем, где я использовал подстановочный знак sql.variable [], и он не выдавал мне ошибок, но запрос дал неверные результаты (пустой запрос). – 1620k

+0

Единственным рабочим решением, использующим NHibernate, было создание динамической строки SQL и передача ее в sql вместе с командой exec. Но у нас была некоторая озабоченность по поводу динамической производительности SQL при большой нагрузке, поэтому в итоге я просто закончил разрыв основного соединения с сеанса NHibernate и написал мое заявление с использованием ADO.NET, как предложил мой коллега. И он отлично работает. – 1620k

+0

Значит, параметр, который я предлагаю, не работает? –

Смежные вопросы