Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Парамметрический SQL-запрос


Автор: Dolphinchik 19.12.2006, 08:36
Имеется переменная типа string, которая представляет собой названия таблиц через запятую, 
Нам необходимо эту переменную, как параметр, поместить в SQL-запрос после from.
Я сделала это следующим образом:

Код

  LIST(Sender);
  Query1.ParamByName('a').AsString:=Edit2.Text;
  Query1.ParamByName('b').AsString:=Edit3.Text;
  Query1.ParamByName('c').AsString:=Edit4.Text;
  Query1.SQL.Add('select * from '+strok_s);
  Query1.SQL.Add('where indfrom=:a');
  Query1.SQL.Add('and ser=:b');
  Query1.SQL.Add('and num=:c');
  Query1.ExecSQL;
  Query1.Active:=true;


Вылетает ошибка, что тип данных поля "a" неизвестен, все парамметры запроса прописанны..да и вообще "a" - не поле..Конец рабочего дня, не понимаю где я могла допустить ошибку, помогите разобраться smile


BDE, FoxPro.

Автор: Savek 19.12.2006, 09:01
1. Значение параметрам присваивай ПОСЛЕ того как установлено  подключение к базе И присвоен текст запроса
2. Query1.ExecSQL; это лишнее, надо либо Open либо Active:=true

Автор: Rodman 19.12.2006, 13:16
Код

  Query1.SQL.Add('select * from '+strok_s);
  Query1.SQL.Add('where indfrom=:a');
  Query1.SQL.Add('and ser=:b');
  Query1.SQL.Add('and num=:c');
  Query1.ParamByName('a').AsString:=Edit2.Text;
  Query1.ParamByName('b').AsString:=Edit3.Text;
  Query1.ParamByName('c').AsString:=Edit4.Text; 
  Query1.ExecSQL;

Автор: Savek 19.12.2006, 14:30
Rodman,  ExecSQL не вернет ни одной строки smile 

Автор: Rodman 19.12.2006, 14:32
Цитата(Savek @  19.12.2006,  13:30 Найти цитируемый пост)
Rodman,  ExecSQL не вернет ни одной строки   

согласен... пропустил...

Код

Query1.SQL.Add('select * from '+strok_s);
  Query1.SQL.Add('where indfrom=:a');
  Query1.SQL.Add('and ser=:b');
  Query1.SQL.Add('and num=:c');
  Query1.ParamByName('a').AsString:=Edit2.Text;
  Query1.ParamByName('b').AsString:=Edit3.Text;
  Query1.ParamByName('c').AsString:=Edit4.Text; 
  Query1.Open;

Автор: Rodman 19.12.2006, 16:13
Код

Query1.SQL.Add('select * from '+strok_s+' where indfrom='+Edit2.Text+' and ser='+Edit3.Text+' and num='+Edit4.Text+';'); 
  Query1.Open;

Автор: Savek 19.12.2006, 16:58
От нечего делать поправлю немного
Код

Query1.SQL.Add('select * from '+strok_s+' where indfrom='+QuotedStr(Edit2.Text)+' and ser='+QuotedStr(Edit3.Text)+' and num='+QuotedStr(Edit4.Text)+';'); 
Query1.Open;

Кстати где автор? Для кого мы здесь стараемся? smile 

Автор: Rodman 19.12.2006, 17:01
Savek, что это такое??? (QuotedStr) - никогда не юзал...

Но у меня и без этого работает...

Автор: Vas 19.12.2006, 20:05
Rodman, QuotedStr заключает строку переданную параметром в эту функцию в одинарные кавычки, очень полезная функция. 
Цитата(Rodman @  19.12.2006,  17:01 Найти цитируемый пост)

Но у меня и без этого работает...

Да и будет работать если в Edit'ах числовые значения вводятся, а если строки то наврядли.

Автор: Rodman 19.12.2006, 23:08
Vas, cенкс...

Автор: Savek 20.12.2006, 09:33
Сначала я подумал что у нее поля строковые, но сейчас, глядя названия не уверен...
В последней поправке могу быть и не прав smile 

Автор: Vas 20.12.2006, 09:46
Из текста Dolphinchik:
Код

Query1.ParamByName('a').AsString

параметр передается как строка, значит поля вероятнее всего строковые.

Автор: Mephisto 20.12.2006, 10:01
Цитата(Dolphinchik @  19.12.2006,  09:36 Найти цитируемый пост)
эту переменную, как параметр, поместить в SQL-запрос 

На сколько я знаю Delphi не разрешает помещать название таблиц как параметр. smile

Автор: Vas 20.12.2006, 11:45
Цитата(Mephisto @  20.12.2006,  10:01 Найти цитируемый пост)
На сколько я знаю Delphi не разрешает помещать название таблиц как параметр.

Так нельзя:
Код

ADOQuery1.SQL.Add('select * from :table');
ADOQuery1.ParamByName('table').AsString:='t_dolg';

А так без проблем:
Код

Tab:='t_dolg';
ADOQuery1.SQL.Add('select * from '+Tab);

Что и делает автор  smile 

Автор: Rodman 20.12.2006, 11:48
Mephisto, в данном случае это не параметр... строка запроса формируется и все...

Автор: Mephisto 20.12.2006, 13:17
Цитата(Dolphinchik @  19.12.2006,  09:36 Найти цитируемый пост)
Нам необходимо эту переменную, как параметр, поместить в SQL-запрос после from.

 smile 
Цитата(Rodman @  20.12.2006,  12:48 Найти цитируемый пост)
в данном случае это не параметр... 

Я заметил.  smile

Добавлено @ 13:18 
Dolphinchik, а в каком месте ошибка?

Автор: Dolphinchik 27.12.2006, 07:10
добре, я автор, болела, вникаю заново.

поля строковые.

параметры убрала...делаю так:

Query1.SQL.Add('select * from '+strok_s);
    Query1.SQL.Add('where INDFROM='+Edit2.Text);
    Query1.SQL.Add('and SER='+Edit3.Text);
    Query1.SQL.Add('and NUM='+Edit4.Text);
    Query1.Open;

Добавлено @ 07:16 
выдаёт ошибку...
искл класса EDBEngineError
Invalid use of keyword.
Token: where
Line number: 3.

Автор: Mephisto 27.12.2006, 10:05
Dolphinchik, пробел перед where поставь! smile

Добавлено @ 10:06 
Код

Query1.SQL.Add('select * from '+strok_s);
    Query1.SQL.Add(' where INDFROM='+Edit2.Text);
    Query1.SQL.Add(' and SER='+Edit3.Text);
    Query1.SQL.Add(' and NUM='+Edit4.Text);
    Query1.Open;


Автор: Savek 29.12.2006, 17:56
Цитата(Mephisto @  27.12.2006,  10:05 Найти цитируемый пост)
Dolphinchik, пробел перед where поставь! 

Не спасет, это же не строка, а список

Скорее всего неудачно выбраны имена полей, например NUM - это может быть служебное слово сервера БД. Попробуй заключить имена полей в квадратные скобки:
Код

Query1.SQL.Add('select * from '+strok_s);
Query1.SQL.Add('where [INDFROM]='+Edit2.Text);
Query1.SQL.Add('and [SER]='+Edit3.Text);
Query1.SQL.Add('and [NUM]='+Edit4.Text);
Query1.Open;

Автор: Mephisto 3.1.2007, 09:49
Savek, ты прав.  smile 
Я провтыкал. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)