![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADOQuery + ClientDataSet. Ошибка при пустом параметре [D7, MSSQL]
Vlad © (2005-11-15 17:54:00)БД - MS-SQL
В ADOQuery пишу простейший запрос:
select * from MyTable where MyStringField = :param
Параметру задаю тип String, нужную длину и т.п.
в коде программы:
AdoQuery.Parameters[0].Value := ''; // задаю пустую строку
AdoQuery.Open;
Все работает как надо.
Теперь беру ClientDataSet и через провайдера подключаю его к моему ADOQuery. У ClientDataSet так же прописываю параметр и задаю ему тип String и нужную длину.
в коде программы пишу:
ClientDataSet.Params[0].Value := '';
ClientDataSet.Open;
Так вот, если параметру присвоить пустое значение, то на Open вываливается exception: "The text, ntext ot image data can not be compared or sorted, except wher using IS NULL or LIKE operator".
Если непустое - то все ОК.
Смотрю профайлером, какой запрос посылается на сервер.
Профайлер говорит что тип моего параметра почему-то "text", значение - ''
а в случае непустого параметра - тип varchar, как и должно быть.
Так же, если использовать ADOQuery, без всяких ClientDataSet-ов, то пустой параметр тоже проходит нормально, и подставляется как varchar
Вобщем, понятно что кто-то (толи ClientDataSet, толи DataSetProvider) неправильно интерпретирует тип параметра, в случае, если ему присвоить ''. Но непонятно как это побороть.
Приходила в голову идея в sql запросе явно преобразовывать параметр к varchar, но это если не докопаюсь до истины...
Поделитесь, если у кого нибудь возникнут какие-то мысли по поводу данной проблемы.
Спасибо.
Johnmen (2005-11-15 23:39:00) [21]Да-да, Desdechado © похоже прав.
Params.ParamByName('xxx').AsString
>sniknik © (15.11.05 21:48) [7]
>ClientDataSet.Params[0].Value := #32;
Это же пробел...:)
Desdechado (2005-11-15 22:49:00) [22]может, стоит присваивать не Value, а AsString ?
sniknik (2005-11-15 21:48:00) [23]> select * from MyTable where MyStringField = :param
....
> ClientDataSet.Params[0].Value := '';
> ClientDataSet.Open;
> Так вот, если параметру присвоить пустое значение, ...
т.е. нужно сравнить с пустой строкой? попробуй так
ClientDataSet.Params[0].Value := #32;
Vlad (2005-11-15 21:04:00) [24]
> ivb2001 (15.11.05 20:57) [5]
> Попробуйте чиста канкретно присвоить NIL
Вероятно, имелось ввиду null?
Ну да, можно и так, только в результате и в sql запрос подставится null, а мне нужно подставить туда пустую строку :-)
И еще, не понимаю как связаны "паскалевские" кавычки и SQL ? :-)
ivb2001 (2005-11-15 20:57:00) [25]Для SQL паскакалевские двойные кавырки - пустой звук. Я с этим в InterBase напарился вдоволь. Попробуйте чиста канкретно присвоить NIL(вот только забыл как это правильно будет EmptyVar то ли VarEmpty ибо Parms[].value имеет тип Variant) Вобщем идея, думается, понятна
Vlad (2005-11-15 18:19:00) [26]
> Ega23 © (15.11.05 18:13) [3]
Если быть точнее, руками я его не прописываю, а делаю Fetch params в дизайн-тайме. При этом он сам у себя прописывает параметр, соответствующий параметру у ADOQuery.
Я просто контролирую чтобы тип и размер совпадал с тем, который у ADOQuery (бывает, иногда не совпадает)
Ega23 (2005-11-15 18:13:00) [27]
> В смысле у параметра? Сколько не ставь, хоть 50 хоть 150
> - бесполезно :-(
А зачем ты, кстати, ClientDataSet'у параметр прописываешь?
Vlad (2005-11-15 18:09:00) [28]
> Ega23 © (15.11.05 18:06) [1]
> Попробуй у строки длину поставь. 50, например.
В смысле у параметра? Сколько не ставь, хоть 50 хоть 150 - бесполезно :-(
Ega23 (2005-11-15 18:06:00) [29]Попробуй у строки длину поставь. 50, например.