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


Автор: marhatter 2.12.2009, 18:16
Здравствуйте. База данных dBase, способ доступа - BDE. Пишу слудующий простой запрос- 
Код

while not Query1.Eof do
begin
   Query2.Close;
   Query2.SQL.Clear;
   Query2.Sql.Add('SELECT '''+tab+'''.CHET AS ST');
   Query2.Sql.Add('FROM ''' + tab + ''' AS t1');
   Query2.Sql.Add('WHERE t1.CHET = '''+ s +''' ');
   Query2.Open;
   st := Query2.FieldByName('ST').AsString;
end;

где s - значения предудушего запроса (12345,42170,45678, .....) (просматриваю из в цикле).
Проблема в том, что для числа 42170 запрос зависает и не выдает никаких результатов(есть несколько таких "плохих" чисел). Для остальных чисел запрос работает.

Автор: Frees 2.12.2009, 19:46
что в tab зачем в апострофах?

Код


while not Query1.Eof do
begin
   Query2.Close;
   Query2.SQL.Clear;
   Query2.Sql.Add('SELECT tl.CHET AS ST');
   Query2.Sql.Add('FROM ' + tab + ' AS t1');//если tab не меняется внутри цикла, то нужно вынести за цикл
   Query2.Sql.Add('WHERE t1.CHET = :stt');
   Query2.ParamByName('stt').AsString := s;
   Query2.Open;
   st := Query2.FieldByName('ST').AsString;
   Query1.Next;
end;


а так?


а это реальный запрос? а то ты выбираешь и в условие пишешь одно и тоже поле...

Автор: Данкинг 2.12.2009, 19:51
"select TAB from TAB" ? smile Т.е. название таблицы совпадает с названием поля?

Автор: marhatter 2.12.2009, 20:08
Цитата(Frees @ 2.12.2009,  19:46)
что в tab зачем в апострофах?

Код


while not Query1.Eof do
begin
   Query2.Close;
   Query2.SQL.Clear;
   Query2.Sql.Add('SELECT tl.CHET AS ST');
   Query2.Sql.Add('FROM ' + tab + ' AS t1');//если tab не меняется внутри цикла, то нужно вынести за цикл
   Query2.Sql.Add('WHERE t1.CHET = :stt');
   Query2.ParamByName('stt').AsString := s;
   Query2.Open;
   st := Query2.FieldByName('ST').AsString;
   Query1.Next;
end;


а так?


а это реальный запрос? а то ты выбираешь и в условие пишешь одно и тоже поле...


в tab - путь к таблице, типа 'C:\...'. Да это реальный запрос. Проверить так это или не так пока нет возможности, как проверю отпишусь.

Добавлено через 45 секунд
Цитата(Данкинг @ 2.12.2009,  19:51)
"select TAB from TAB" ? smile Т.е. название таблицы совпадает с названием поля?

Название таблицы не совпадает с названием поля

Добавлено через 1 минуту и 59 секунд
спасибо что откликнулись на мой вопрос

Добавлено через 12 минут и 8 секунд
С параметром тоже пробывал, безрезультатно. C большинством вот этих меняющихся значений S запрос работает,  не работает при определенных значениях. Даже если просто выбирать из таблицы вот так: 
Код

   Query2.Close;
   Query2.SQL.Clear;
   Query2.Sql.Add('SELECT tl.CHET');
   Query2.Sql.Add('FROM ' + tab + ' AS t1');//если tab не меняется внутри цикла, то нужно вынести за цикл
   Query2.Sql.Add('WHERE t1.CHET = 42170');
   Query2.Open;

он также зависает. 

Автор: Данкинг 2.12.2009, 20:32
Цитата(marhatter @  2.12.2009,  20:08 Найти цитируемый пост)
Название таблицы не совпадает с названием поля

Ну да, попутал я. smile 

Цитата(marhatter @  2.12.2009,  20:08 Найти цитируемый пост)
не работает при определенных значениях. 

Попробуй оставь в таблице одно это "глючное" значение - тоже зависать будет?

Автор: marhatter 2.12.2009, 20:39
Цитата(Данкинг @ 2.12.2009,  20:32)
Цитата(marhatter @  2.12.2009,  20:08 Найти цитируемый пост)
Название таблицы не совпадает с названием поля

Ну да, попутал я. smile 

Цитата(marhatter @  2.12.2009,  20:08 Найти цитируемый пост)
не работает при определенных значениях. 

Попробуй оставь в таблице одно это "глючное" значение - тоже зависать будет?

Дело в том оно не одно в таблице. Я методом "проб и ошибок" их вычленил из таблицы, если я их исключаю в запросе то все норм работает, если с ними то зависает. Ну попробую завтра оставить одно из таких значений , для проверки. 

Автор: Frees 2.12.2009, 20:41
Цитата(marhatter @  2.12.2009,  23:39 Найти цитируемый пост)
если с ними то зависает

что значит зависает? на чем вичит? может у тебя просто селект ничего не возвращает и поэтому "зависает"?

Автор: marhatter 2.12.2009, 20:52
Цитата(Frees @ 2.12.2009,  20:41)
Цитата(marhatter @  2.12.2009,  23:39 Найти цитируемый пост)
если с ними то зависает

что значит зависает? на чем вичит? может у тебя просто селект ничего не возвращает и поэтому "зависает"?

"зависает" на  Query2.Open. Приложение после этого ни как не реагирует. В таблице существуют записи с  такими нехорошими значениями.

Автор: Frees 2.12.2009, 20:56
может их ООчень много? ждать пробовал?
или запрос написать для выбора только 1 записи 

Код

Query2.Sql.Add('SELECT First 1 tl.CHET');

Автор: marhatter 2.12.2009, 21:00
Цитата(Frees @ 2.12.2009,  20:56)
может их ООчень много? ждать пробовал?
или запрос написать для выбора только 1 записи 

Код

Query2.Sql.Add('SELECT First 1 tl.CHET');

Их, например значения как в примере выше (421701),  5 штук в таблице. Ждал... Нет не пробывал выбирать только  1 запись, попробуем.

Автор: marhatter 3.12.2009, 07:54
Здравствуйте. Вот в общем более полный код:
Код

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT t1.LCHET AS CHET, t1.SV VAL, t1.MESYAC, t1.GOD, t1.SUMMAPAY AS SUMMA, t1.DBEGPERIOD, t1.IST AS IST, t1.TYPEGRAF ');
Query1.SQL.Add('FROM '''+ tab + ''' AS t1');
Query1.SQL.Add('WHERE (t1.SV IN (1,2,7)) and (t1.MESYAC = ''' + IntToStr(num) + ''') and (t1.GOD = ''' + god + ''') and (t1.TYPEGRAF = 6) and (t1.DBEGPERIOD < ''' + data + ''')');
Query1.Open;
Query1.First;
while not Query1.Eof do
begin
   l1 := Query1.FieldByName('CHET').AsString;
   Query2.Close;
   Query2.SQL.Clear;
   Query2.SQL.Add('SELECT  t2.LCHET AS CHET');
   Query2.Sql.Add('FROM '''+ tab2 +''' AS t2');
   Query2.SQL.Add('WHERE (t2.LCHET = :stt) and (t2.SV IN (1,2,6,7))');
   Query2.ParamByName('stt').AsString := l1;
   Query2.Open;
   l2 := Query2.FieldByName('CHET').AsString;
   Query1.Next;
end;

Выдает ошибку  'Type micmatch in expression'

Автор: Frees 3.12.2009, 08:00
Цитата(marhatter @  3.12.2009,  10:54 Найти цитируемый пост)
Выдает ошибку  'Type micmatch in expression'

где?

 зы сборку запроса надо за цикл!

Автор: marhatter 3.12.2009, 08:02
Делаю так 
Код

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT t1.LCHET AS CHET, t1.SV VAL, t1.MESYAC, t1.GOD, t1.SUMMAPAY AS SUMMA, t1.DBEGPERIOD, t1.IST AS IST, t1.TYPEGRAF ');
Query1.SQL.Add('FROM '''+ tab + ''' AS t1');
Query1.SQL.Add('WHERE (t1.SV IN (1,2,7)) and (t1.MESYAC = ''' + IntToStr(num) + ''') and (t1.GOD = ''' + god + ''') and (t1.TYPEGRAF = 6) and (t1.DBEGPERIOD < ''' + data + ''')');
Query1.Open;
Query1.First;
while not Query1.Eof do
begin
   l1 := Query1.FieldByName('CHET').AsString;
   Query2.Close;
   Query2.SQL.Clear;
   Query2.SQL.Add('SELECT  t2.LCHET AS CHET');
   Query2.Sql.Add('FROM '''+ tab2 +''' AS t2');
   Query2.SQL.Add('WHERE (t2.LCHET = ''' + l1 +''') and (t2.SV IN (1,2,6,7))');
   Query2.Open;
   l2 := Query2.FieldByName('CHET').AsString;
   Query1.Next;
end;


зависает))).

Добавлено через 5 минут и 41 секунду
Цитата(Frees @ 3.12.2009,  08:00)
Цитата(marhatter @  3.12.2009,  10:54 Найти цитируемый пост)
Выдает ошибку  'Type micmatch in expression'

где?

 зы сборку запроса надо за цикл!

Ошибку выдает на Query2.Open. 

Автор: Frees 3.12.2009, 08:14

Цитата(marhatter @  3.12.2009,  10:54 Найти цитируемый пост)
Выдает ошибку  'Type micmatch in expression'

LCHET какого типа

ЗЫ может BDE в печь!?

Автор: marhatter 3.12.2009, 08:20
Цитата(Frees @ 3.12.2009,  08:14)
Цитата(marhatter @  3.12.2009,  10:54 Найти цитируемый пост)
Выдает ошибку  'Type micmatch in expression'

LCHET какого типа

ЗЫ может BDE в печь!?

LCHET - NUMERIC, раньше проблем с BDE не было, да и сейчас думаю не в нем дело(может ошибаюсь), для некоторых значений то работает все норм, а для некоторых никак не хочет

Автор: Frees 3.12.2009, 08:28
Цитата(marhatter @  3.12.2009,  11:20 Найти цитируемый пост)
LCHET - NUMERIC

а ты ему строку пихаешь!
делай через параметр, но
Код

Query2.ParamByName('stt').AsInteger := StrToIntDef(l1, -1);

Автор: marhatter 3.12.2009, 08:31
Цитата(Frees @ 3.12.2009,  08:28)
Цитата(marhatter @  3.12.2009,  11:20 Найти цитируемый пост)
LCHET - NUMERIC

а ты ему строку пихаешь!
делай через параметр, но
Код

Query2.ParamByName('stt').AsInteger := StrToIntDef(l1, -1);

я пробывал и через ASInteger, но вот щас попробую вот этот вариант

Добавлено через 7 минут
Попробывал 
Код

 Query2.Close;
 Query2.SQL.Clear;
 Query2.SQL.Add('SELECT t2.LCHET AS CHET');
 Query2.Sql.Add('FROM '''+ tab2 +''' AS t2');
 Query2.SQL.Add('WHERE (t2.LCHET = :stt) and (t2.SV IN (1,2,6,7))');
 Query2.ParamByName('stt').AsInteger := StrToIntDef(l1, -1);

зависает на этом же значении.

Автор: Frees 3.12.2009, 08:42
проверь на ado....

Автор: Данкинг 3.12.2009, 11:43
Открой .dbf фоксом и проверь запрос непосредственно в СУБД. Часто это помогает понять проблему.

Автор: Демо 3.12.2009, 12:14
Если  таблицы небольшие, то молжно было б и сюда прикрепить с примером.

Автор: marhatter 3.12.2009, 12:16
Цитата(Frees @ 3.12.2009,  08:42)
проверь на ado....

проверил через ADO, вроде работает)))), но сейчас проблема с датой в SELECT, какой формат она имеет.
Код

ADOQuery1.SQL.Add('WHERE (t1.SV IN (1,2,7)) and (t1.DBEGPERIOD < :par)');
ADOQuery1.Parameters.ParamByName('par').Value:= data;


пробывал data - 2009.11.01, 01.11.2009, 01/11/2009.
тип data - string.

Добавлено через 1 минуту и 9 секунд
пишет ошибку - Operator/operand type mismatch

Добавлено через 2 минуты и 48 секунд
Цитата(Демо @ 3.12.2009,  12:14)
Если  таблицы небольшие, то молжно было б и сюда прикрепить с примером.

большие таблицы, так бы конечно прикрепил)))

Автор: Данкинг 3.12.2009, 12:24
Цитата(marhatter @  3.12.2009,  12:16 Найти цитируемый пост)
проверил через ADO, вроде работает))))

Правильно: откуда только ты этот BDE откопал. smile 

Цитата(marhatter @  3.12.2009,  12:16 Найти цитируемый пост)
но сейчас проблема с датой в SELECT, какой формат она имеет.

На фоксе с датой работают так:
Код

select * from TABLE where dat>{^2009-12-02}

Пробуй. smile 

Автор: Демо 3.12.2009, 12:27
marhatter, 

У тебя с данными какая-то проблема.
Ты ведь не одно поле выбираешь.
Создай другой запрос на движке BDE, который выбирал бы только одну запись, но не использовал в условии проблемное значение, т.е. с условиями по другим полям, чтобы проверить возвращаемые значения.
Также проверь, что в настройках BDE включена опция BCD=True.

Добавлено @ 12:28
Цитата(Данкинг @  3.12.2009,  12:24 Найти цитируемый пост)
Правильно: откуда только ты этот BDE откопал. 


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

PS. 
Только смысла в споре об этом нет.

Автор: marhatter 3.12.2009, 12:43
вобщем сделал с ADO с датой в формате:
   select * from TABLE where dat>{^2009-12-02}
работает!!!
Сколько использовал BDE никогда не сталкивался с такой проблемой)))), всегда все работало нормально.
СПАСИБО ВСЕМ!!!!

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