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


Автор: oleg153 26.2.2009, 16:27
Не могу передать в ADOQuery значение SQL-запроса.
Если писать в редакторе - проблем нет, но присвоить не получается

Собственно запрос 
-------------------
Select *
from data_record
where rDate='20090210' and rTime='1235' and (rState in ('1','2'))
-------------------

но как его присвоить ?

ADOQuery1.Close;
ADOQuery1.SQL.Add('  select *  ');
ADOQuery1.SQL.Add(' from data_record  ');
ADOQuery1.SQL.Add('  where rDate=:'20090210' and rTime=:'1235' and (rState in ('1','2'))  ');
Понятно что последнюю строку с ' которые обозначают текстовые константы Дельфи не переваривает.

Как можно это сделать ?





Автор: pseud 26.2.2009, 16:54
хотя бы так
Код

  ADOQuery1.SQL.Add('  where rDate=''20090210'' and rTime=''1235'' and (rState in (''1'',''2''))  ');

Автор: oleg153 26.2.2009, 16:58
Вроде понял что '20090210' можно заменить на "20090210" 
но 
(rState in ("1","2"))  все равно не проходит. Пишет что "неверное имя столбца '2'.
Понятно что можно задать через OR , но если значений с которыми сравниваем не 2 а много то получиться слишком громоздко.

Автор: oleg153 26.2.2009, 17:17
Вариант 
Код

ADOQuery1.SQL.Add('  where rDate=''20090210'' and rTime=''1235'' and (rState in (''1'',''2''))  ');

Не проходит. Ошибка сразу в значении столбца rDate

Автор: pseud 26.2.2009, 17:44
Цитата(oleg153 @  26.2.2009,  17:17 Найти цитируемый пост)
Не проходит. Ошибка сразу в значении столбца rDate


тогда выкладывай описание твоей таблицы. а именно - типы полей.

Автор: oleg153 26.2.2009, 18:30
Простейшая таблица, все поля varchar

Автор: Kbl4AH 26.2.2009, 18:56
Код

var
  Query: string;
...
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(Query);

или так
Код

ADOQuery1.SQL.Text := Query;

Автор: oleg153 26.2.2009, 19:24
Казалось все просто, но заставить работать не могу.

Сначала не знал как запрос с обозначением текстовой константы. 
Заменил на " " вроде проверка прошла.

Но проблема в том что у меня часть запроса задается параметрами, а часть это фиксированные значения. И ничего не работает
Код

  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT *'); 
    SQL.Add('FROM data_record');
    SQL.Add('WHERE rCode=:Prm1 and rDate=:Prm2 and rTime=:Prm3 ');
    SQL.Add('and (rState=:"Активен" or rState=:"Исполняется")  ');
    Parameters.ParseSQL(SQL.Text, True);
    Parameters.ParamByName('Prm1').Value:=Edit1.Text;
    Parameters.ParamByName('Prm2').Value:=Edit2.Text;  
    Parameters.ParamByName('Prm3').Value:=Edit3.Text;  
    Open;
  end; 


Таблица имеет все текстовые поля , и передаю соответственно текстовые значения.
Нехотел использовать OR вместо IN, ну ладно. Но почему теперь дает ошибку :
 Неправильно определен обьект Parameter. Предоставлены несовместимые или неполные сведения. 

Как в запросе соединять значения определяемые как параметры (Prm(i)  и значения в виде ТЕКСТОВЫХ которые являются константами и которые в обычном SQL-запросе нужно выделять кавычками 'text'. ?

Автор: oleg153 26.2.2009, 21:41
 Помогает если налепить подряд несколько кавычек. Но логики я понять немогу....

Код

 with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT *'); 
    SQL.Add('FROM data_record');
    SQL.Add('WHERE rCode=:Prm1 and rDate=:Prm2 and rTime=:Prm3 ');
    SQL.Add('and (rState='''+'Активен'+'''  or rState= '''+'Исполняется'+''') ');
    Parameters.ParseSQL(SQL.Text, True);
    Parameters.ParamByName('Prm1').Value:=Edit1.Text;
    Parameters.ParamByName('Prm2').Value:=Edit2.Text;  
    Parameters.ParamByName('Prm3').Value:=Edit3.Text;  
    Open;
  end; 

или если вместо Текстовых констант идут числа , которые пишутся в базе в текстовые поля, тогда 
Код

   SQL.Add('and (rState= '''+inttostr(1)+ ''' or rState= '''+inttostr(2)+ ''') ');


Такой вариант работает.
Но я пока не могу понять что в данной записи обозначают три кавычки подряд ? Почему при их использовании строка не "распадается" ???

Автор: Akella 27.2.2009, 00:39
Цитата(oleg153 @  26.2.2009,  19:24 Найти цитируемый пост)
 SQL.Add('and (rState=:"Активен" or rState=:"Исполняется")  ');

не используй двойные ковычки
пользуйся QuotedStr()

Автор: pseud 27.2.2009, 10:13
oleg153, 
Код

:"Активен"

к чему двоеточие?

Добавлено через 2 минуты и 9 секунд
oleg153, разъясняю пост Акеллы
Код

with ADOQuery1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT *'); 
  SQL.Add('FROM data_record');
  SQL.Add('WHERE rCode=:Prm1 and rDate=:Prm2 and rTime=:Prm3 ');
  SQL.Add('AND (rState=' + QuotedStr('Активен') + ' OR rState= ' + QuotedStr('Исполняется') + ') ');

Автор: oleg153 27.2.2009, 15:34
Спасибо, все понял и сделал. 

Вопрос можно считать закрытым !

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