Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с SQL запросом и 3-я параметрами, ADO 
:(
    Опции темы
Black_Joker
  Дата 11.11.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * From Основная');
ADOQuery1.SQL.Add('WHERE (Имя Like :m1)and(Деятельность Like :m2)and(Описание Like :m3)');

 s:= edit1.text; for i:= 1 to length(s) do if (s[i] = '/') or (s[i] = '#') then s[i]:= '%';
 ADOQuery1.Parameters.ParamByName('m1').Value := '%' + s +'%';

 s:= edit2.text; for i:= 1 to length(s) do if (s[i] = '/') or (s[i] = '#') then s[i]:= '%';
 ADOQuery1.Parameters.ParamByName('m2').Value := '%' + s +'%';

 s:= edit3.text; for i:= 1 to length(s) do if (s[i] = '/') or (s[i] = '#') then s[i]:= '%';
 ADOQuery1.Parameters.ParamByName('m3').Value := '%' + s +'%';

ADOQuery1.SQL.Add('order by Имя');
ADOQuery1.Open; maxb:= -1; listbox1.Clear; ADOQuery1.First;
while not ADOQuery1.eof do
begin
 listbox1.Items.Add(ADOQuery1.FieldValues['Имя']); //memo2.Lines.add('1');
 ADOQuery1.Next;                                   //memo2.Lines.add('2');
 inc(maxb);                                        //memo2.Lines.add('3 maxb:= '+IntToStr(maxb));
end;


Программа виснет если первый и третий параметр вместе не равны %% (аналогично когда все 3 параметра равны чему-то). При всех других вариациях прогамма работатет нормально.
Экспериментально получено что программа виснет в
inc(maxb); //memo2.Lines.add('3 maxb:= '+IntToStr(maxb));
при этом maxb на 1 больше чем надо. smile
PM   Вверх
FRAGNATIC
Дата 12.11.2005, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Black_Joker
зачем в рантайм создовать параметр?
может тогда просто
Add('WHERE (Имя Like %s)and(Деятельность Like %s)and(Описание Like :%s)');
а потом через Format

Код

while not ADOQuery1.eof do    
begin    
 listbox1.Items.Add(ADOQuery1.FieldValues['Имя']); //memo2.Lines.add('1');    
 ADOQuery1.Next;                                   //memo2.Lines.add('2');    
 inc(maxb);                                        //memo2.Lines.add('3 maxb:= '+IntToStr(maxb));    
end;

а может проще использовать DBlistbox smile
а ещё покажи полнастью при каких SQL запросах виснет софтина =)

Это сообщение отредактировал(а) FRAGNATIC - 12.11.2005, 03:58
PM MAIL   Вверх
Black_Joker
Дата 12.11.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



зачем в рантайм создовать параметр?
может тогда просто
Add('WHERE (Имя Like %s)and(Деятельность Like %s)and(Описание Like :%s)');
а потом через Format


это как делается? smile
PM   Вверх
FRAGNATIC
Дата 12.11.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Код

var
  sql: string;
begin
  sql:='WHERE (Имя Like %s)and(Деятельность Like %s)and(Описание Like :%s)'
Add(Format(sql,['1','2','3']));//тоесть 1 и 2 и 3 это параметры в том порядке в котором они указаны в строке ввиде %s
%s - строка
%d - число
а ещё нажми F1 =)


PM MAIL   Вверх
Петрович
Дата 12.11.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



to FRAGNATIC
Параметризированные запросы порой позволяют избавиться от ряда проблем. Раньше, я тоже любил пользоваться Format для формирования текста SQL-запроса. Но, уже давно практически отказался от этого. Теперь, за редким исключением, я использую именно параметризированные запросы.
Подробне, можно почитать здесь: http://forum.vingrad.ru/index.php?showtopi...ndpost&p=270598

Цитата(Black_Joker @ 11.11.2005, 22:29)
Экспериментально получено что программа виснет в
inc(maxb); //memo2.Lines.add('3 maxb:= '+IntToStr(maxb));

Программа не может виснуть в inc(maxb). У тебя какие-то проблеммы с "Экспериментально получено". smile



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
FRAGNATIC
Дата 12.11.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Петрович
да я сам использую по большей части параметры
но в даном примере я не понял зачем их создовать рантайм )
а начал использовать формат тока ща в последнем проекте тк это гораздо удобнее в моей ситуации

А за ссылку большое спасибо =)
PM MAIL   Вверх
Петрович
Дата 13.11.2005, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



Цитата(FRAGNATIC @ 12.11.2005, 21:45)
но в даном примере я не понял зачем их создовать рантайм )

А где он их создает, я что-то не видел?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
FRAGNATIC
Дата 13.11.2005, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Код

ADOQuery1.SQL.Clear;    
ADOQuery1.SQL.Add('SELECT * From Основная');    
ADOQuery1.SQL.Add('WHERE (Имя Like :m1)and(Деятельность Like :m2)and(Описание Like :m3)');

я может чего не догоняю конечно
но выходит что сразу в ADOQuery1 их нету а после добволения этого запроса они появляются=)
новерное =)
PM MAIL   Вверх
Black_Joker
Дата 13.11.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я создаю запросм каждый раз при нажатии кнопки. потом анализирую полученный результат.

Если снять коментарии с заполения Мемо2 и посмотреть на результат...
Код

while not ADOQuery1.eof do
begin
 listbox1.Items.Add(ADOQuery1.FieldValues['Имя']); memo2.Lines.add('1');
 ADOQuery1.Next;                                   memo2.Lines.add('2');
 inc(maxb);                                        memo2.Lines.add('3 maxb:= '+IntToStr(maxb));
end;

У меня получалось
1
2
3 maxb= 1
1
2
3 maxb= 2 (хотя длжно было остановиться на maxb= 1)
и дальше висяк!
PM   Вверх
FRAGNATIC
Дата 13.11.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



maxb - для чего? что она должна в итоге содержать?
PM MAIL   Вверх
Black_Joker
Дата 15.11.2005, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



maxb(integer) - количество строк выданных запросом. Потом динамические массивы задаю и анализирую полученое из запроса.
PM   Вверх
FRAGNATIC
Дата 15.11.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Black_Joker а можент проще тогда
maxbz:=ADOQuery1.RecordsCount =)
и опять же спрошу за чем в цикле все строки добовлять вот так
listbox1.Items.Add(ADOQuery1.FieldValues['Имя']);
не проще заюзать дблистбокс ?
PM MAIL   Вверх
Black_Joker
Дата 16.11.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Такой геморой я применяю из-за незнания языка (англ и делфи).
Дельфи изучил когда знакомая типография заказала "калькулятор".

А можно попросить описание компонент АДО на русском языке.
PM   Вверх
FRAGNATIC
Дата 16.11.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Black_Joker
в разделе литература посмотри книги
новерное тебе подайдёт книга "библия дэлфи" скачай её и читай а в главе посвещёной БД вообщем есть описание и примеры работы с АДО )
PM MAIL   Вверх
Black_Joker
Дата 17.11.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите как использовать процедуру ADOQuery1.GetFieldList?
PM   Вверх
FRAGNATIC
Дата 18.11.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Black_Joker
ну что-то типа
var
list: TList;
begin
ADOQuery1.GetFieldList(list,'fieldname');
end;
PM MAIL   Вверх
Black_Joker
Дата 18.11.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как этим заполнить листбокс?
PM   Вверх
FRAGNATIC
Дата 18.11.2005, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Black_Joker
мм
а может кинуть на форму DBListBox в его свойстве и в его свойствах указать DataSource u DataField ?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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