Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADOQuery + ClientDataSet. Ошибка при пустом параметре [D7, MSSQL]


Страницы:   1 2

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, например.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо