Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вставить текстовое значение в SQL-запрос в ADO 
V
    Опции темы
oleg153
Дата 26.2.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Не могу передать в 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'))  ');
Понятно что последнюю строку с ' которые обозначают текстовые константы Дельфи не переваривает.

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






Это сообщение отредактировал(а) oleg153 - 26.2.2009, 16:52
PM MAIL   Вверх
pseud
Дата 26.2.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



хотя бы так
Код

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



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
oleg153
Дата 26.2.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



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


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Вариант 
Код

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

Не проходит. Ошибка сразу в значении столбца rDate
PM MAIL   Вверх
pseud
Дата 26.2.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



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


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


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
oleg153
Дата 26.2.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Простейшая таблица, все поля varchar
PM MAIL   Вверх
Kbl4AH
Дата 26.2.2009, 18:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Код

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

или так
Код

ADOQuery1.SQL.Text := Query;


Это сообщение отредактировал(а) Kbl4AH - 26.2.2009, 18:57
PM MAIL ICQ   Вверх
oleg153
Дата 26.2.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Казалось все просто, но заставить работать не могу.

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

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

  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'. ?
PM MAIL   Вверх
oleg153
Дата 26.2.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



 Помогает если налепить подряд несколько кавычек. Но логики я понять немогу....

Код

 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)+ ''') ');


Такой вариант работает.
Но я пока не могу понять что в данной записи обозначают три кавычки подряд ? Почему при их использовании строка не "распадается" ???
PM MAIL   Вверх
Akella
Дата 27.2.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



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

не используй двойные ковычки
пользуйся QuotedStr()
PM MAIL   Вверх
pseud
Дата 27.2.2009, 10:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



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('Исполняется') + ') ');



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
oleg153
Дата 27.2.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Спасибо, все понял и сделал. 

Вопрос можно считать закрытым !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.