Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.06;
Скачать: CL | DM;

Вниз

TADODataSet с выходным параметром.   Найти похожие ветки 

 
harisma   (2008-01-24 13:40) [0]

Кто подскажет, как решить проблему:
Есть база данных на 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 последовательно нечетного числа символов ` и/или ".

В чем проблема и как ее решить?


 
Ega23 ©   (2008-01-24 14:14) [1]

1. Параметры так не используются.
2. select Result=Count(*) FROM sysmessages AS D
where (IsNull(D.description, "") = "`"aaaa"")


 
sniknik ©   (2008-01-24 14:31) [2]

> последовательно нечетного числа символов ` и/или ".
строки нужно передавать в запросы параметрами! а вот параметр используемый для получения количества записей в запросе лишний, значение и так передается в полученном рекордсете.

> 1. Параметры так не используются.
обычно да, но вариант вполне рабочий.


 
Ega23 ©   (2008-01-24 14:38) [3]


> обычно да, но вариант вполне рабочий.


Рабочий, тока зачем так????


 
sniknik ©   (2008-01-24 14:55) [4]

> Рабочий, тока зачем так????
а вот это не ко мне ;)

я параметр так использовал, както, чтобы не возвращать рекордсет ради одного значения, получилось быстрее. а тут... тем более дублирующее. (и еще хуже если сам рекордсет не используется. что видно подразумеваешь ты давая свой 2 вариант)

и еще кстати непонятно зачем null заменять на пустую строку и затем сравнивать ее с заведомо несовподающей... сравнение с null и так лож.


 
harisma   (2008-01-24 16:28) [5]

Я * в запросе для упрощения написал. А так должен возвращаться рекордсет с набором полей. А выражение IsNull(<Имя поля>, "") = тоже динамическое. Нужное имя поля передается извне. Поэтому за ответы спасибо, но это все пожалуй не то, что мне надо. Какие еще будут советы-предложения? Жду.


 
Ega23 ©   (2008-01-24 16:29) [6]


> Какие еще будут советы-предложения? Жду.


Для начала задачу сформулируй внятно.
А то будешь ждать до бесконечности.


 
harisma   (2008-01-24 17:01) [7]

Куда уж внятнее.
В 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 17:04) [8]


> set :abspos = @@ROWCOUNT


> .CreateParameter("abspos", ftInteger, pdOutput, 0, 0);


set 18=@@ROWCOUNT


 
harisma   (2008-01-24 17:12) [9]


>
> set 18=@@ROWCOUNT

Не понял.


 
sniknik ©   (2008-01-24 17:23) [10]

> именно при наличии НЕЧЕТНОГО количества символов "`" и\или """ в условии where?
потому что парсер автоматического определения параметров "запутался" и считает незавершенной строкой все что после такого непарного символа.

а то что ты там понаписал в "примерном коде", это извини бред, скажи мне источник из которого почерпнута сия "мудрость", и я буду его не любить наравне с Фленовым и Архангельским...

> TADODataSet(tbl)
ко всему прочему тут еще похоже приведение таблицы к датасету... весело.


 
harisma   (2008-01-24 17:32) [11]


> тут еще похоже приведение таблицы к датасету

нет, это не приведение таблицы к датасету. tbl имеет тип TADODataSet. Я не знаю, кто это писал - мне такой код достался по наследству. Другими словами, это приведение можно убрать.

А вот что посоветуешь делать с этим парсером определения параметров? Как преобразовать входные параметры так, чтоб парсер их понял? Можно ли эти специфические символы заменить на их эквивалент, ну например как в дельфийском коде символ " можно написать как chr($27).


 
sniknik ©   (2008-01-24 17:38) [12]

> Как преобразовать входные параметры так, чтоб парсер их понял?
ты задаешь неправильные вопросы...
а что делать, я еще в первом посте сказал. сейчас могу еще только добавить - еще надо учится... чтобы понимать что именно ты делаешь, и зачем.



Страницы: 1 вся ветка

Текущий архив: 2008.07.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
2-1212920874
ply
2008-06-08 14:27
2008.07.06
где в БД хранить картинки?


2-1213030061
wq
2008-06-09 20:47
2008.07.06
сохранение группы файлов


15-1211752649
Германн
2008-05-26 01:57
2008.07.06
CSIDL_COMMON_DOCUMENTS


15-1211369055
БарЛог
2008-05-21 15:24
2008.07.06
Иконка кнопки "Вакансии"


15-1210089446
Anatoly Podgoretsky
2008-05-06 19:57
2008.07.06
Тестирование NNTP сервера