![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TADODataSet с выходным параметром. [D5, MSSQL]
harisma © (2008-01-24 13:40:00)Кто подскажет, как решить проблему:
Есть база данных на MSSQL. Может быть даже стандартная, например, master. Берем стандартную таблицу, у котрой есть стринговые поля. Скажем, sysmessages, поле description.
Помещаем на форму компонент TADOConnection и через него коннектимся к этой базе. Помещаем на форму компонент TADODataSet. Устанавливаем ему свойство Connection = ADOConnection1. Создаем для свойства Parameters новый выходной параметр abspos типа integer. В свойстве CommandText пишем следующий скрипт:
select * FROM sysmessages AS D
where (IsNull(D.description, '') = '`"aaaa"')
set :abspos = @@ROWCOUNT
При попытке установить свойство Active = True выдается ошибка в строке 4: Incorrect syntax near 'abspos'.
Причем эта ошибка повторяется именно при наличии в условии where последовательно нечетного числа символов ` и/или ".
В чем проблема и как ее решить?
sniknik (2008-01-24 17:38:00) [1]> Как преобразовать входные параметры так, чтоб парсер их понял?
ты задаешь неправильные вопросы...
а что делать, я еще в первом посте сказал. сейчас могу еще только добавить - еще надо учится... чтобы понимать что именно ты делаешь, и зачем.
harisma (2008-01-24 17:32:00) [2]
> тут еще похоже приведение таблицы к датасету
нет, это не приведение таблицы к датасету. tbl имеет тип TADODataSet. Я не знаю, кто это писал - мне такой код достался по наследству. Другими словами, это приведение можно убрать.
А вот что посоветуешь делать с этим парсером определения параметров? Как преобразовать входные параметры так, чтоб парсер их понял? Можно ли эти специфические символы заменить на их эквивалент, ну например как в дельфийском коде символ ' можно написать как chr($27).
sniknik (2008-01-24 17:23:00) [3]> именно при наличии НЕЧЕТНОГО количества символов '`' и\или '"' в условии where?
потому что парсер автоматическогоопределения параметров "запутался" и считает незавершенной строкой все что после такого непарного символа.
а то что ты там понаписал в "примерном коде", это извини бред, скажи мне источник из которого почерпнута сия "мудрость", и я буду его не любить наравне с Фленовым и Архангельским...
> TADODataSet(tbl)
ко всему прочему тут еще похоже приведение таблицы к датасету... весело.
harisma (2008-01-24 17:12:00) [4]
>
> set 18=@@ROWCOUNT
Не понял.
Ega23 (2008-01-24 17:04:00) [5]
> set :abspos = @@ROWCOUNT
> .CreateParameter('abspos', ftInteger, pdOutput, 0, 0);
set 18=@@ROWCOUNT
harisma (2008-01-24 17:01:00) [6]Куда уж внятнее.
В TADODataSet есть SQL скрипт:
select D.<Field_1>, D.<Field_2>, D.<Field_3>... FROM <TableName> AS D
where (IsNull(D.<Field_n>, '') = '`')
set :abspos = @@ROWCOUNT
Этот скрипт формируется динамически, тоесть набор полей может быть различным.
Примерный кусок кода из проекта:
TADODataSet(tbl).Close;
TADODataSet(tbl).Parameters.Clear;
TADODataSet(tbl).ParamCheck := True;
TADODataSet(tbl).Parameters.CreateParameter('abspos', ftInteger, pdOutput, 0, 0);
TADODataSet(tbl).CommandText := stmtSQL;
TADODataSet(tbl).Open;
в этом коде stmtSQL = вышеприведенному скрипту.
При вызове операцииTADODataSet(tbl).Open;выдает ошибку Incorrect syntax near 'abspos'.Как эту проблему решить и почему такая ситуация возникает именно при наличии НЕЧЕТНОГО количества символов '`' и\или '"' в условии where?
Ega23 (2008-01-24 16:29:00) [7]
> Какие еще будут советы-предложения? Жду.
Для начала задачу сформулируй внятно.
А то будешь ждать до бесконечности.
harisma (2008-01-24 16:28:00) [8]Я * в запросе для упрощения написал. А так должен возвращаться рекордсет с набором полей. А выражение IsNull(<Имя поля>, '') = тоже динамическое. Нужное имя поля передается извне. Поэтому за ответы спасибо, но это все пожалуй не то, что мне надо. Какие еще будут советы-предложения? Жду.
sniknik (2008-01-24 14:55:00) [9]> Рабочий, тока зачем так????
а вот это не ко мне ;)
я параметр так использовал, както, чтобы не возвращать рекордсет ради одного значения, получилось быстрее. а тут... тем более дублирующее. (и еще хуже если сам рекордсет не используется. что видно подразумеваешь ты давая свой 2 вариант)
и еще кстати непонятно зачем null заменять на пустую строку и затем сравнивать ее с заведомо несовподающей... сравнение с null и так лож.
Ega23 (2008-01-24 14:38:00) [10]
> обычно да, но вариант вполне рабочий.
Рабочий, тока зачем так????
sniknik (2008-01-24 14:31:00) [11]> последовательно нечетного числа символов ` и/или ".
строки нужно передавать в запросы параметрами! а вот параметр используемый для получения количества записей в запросе лишний, значение и так передается в полученном рекордсете.
> 1. Параметры так не используются.
обычно да, но вариант вполне рабочий.
Ega23 (2008-01-24 14:14:00) [12]1. Параметры так не используются.
2.select Result=Count(*) FROM sysmessages AS D
where (IsNull(D.description, '') = '`"aaaa"')