Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Два почти одинаковых запроса выполняются по разному


Страницы:   1 2

И. Павел ©   (2010-08-10 09:13:00) 

Здравствуйте.
Я работаю с Access в Delphi 7 через ADO, JET.
Первоначальный запрос (SELECT с несколькими LEFT JOIN) выполняется нормально и возвращает 3 записи. Если заменить прямую подстановку двух чисел в строку запроса (с помощью “+ IntToStr(…) +”) на параметры, то запрос возвращает пустую выборку (но если использовать любой из этих двух параметров, а второй IntToStr оставить, то запрос опять будет работать правильно).

Вот первоначальный запрос (он выполняется нормально – возвращает 3 записи):

 DMQ.ADODS.Active := false;
 DMQ.ADODS.CommandText :=
   'SELECT j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo AS FIO, s1.summa AS s1_summa, n.summa AS n_summa, sum(o.summa) AS sum_o_summa, s2.summa AS s2_summa ' +
   'FROM (((nachisl AS n ' +
   'LEFT JOIN jilci AS j ON (j.id = n.IDJilci AND j.IDDoma = ' + IntToStr(id) + ')) ' +
   'LEFT JOIN saldo AS s1 ON (s1.IDJilci = n.IDJilci AND s1.god = ' + IntToStr(god) + ' AND s1.mes = ' + IntToStr(mes) + ')) ' +
   'LEFT JOIN saldo AS s2 ON (s2.IDJilci = n.IDJilci AND s2.god = ' + IntToStr(NextGod) + ' AND s2.mes = ' + IntToStr(NextMes) + ')) ' +
   'LEFT join oplati AS o ON (o.IDJilci = n.IDJilci AND o.god = ' + IntToStr(god) + ' AND o.mes = ' + IntToStr(mes) + ') ' +
   'WHERE n.god = ' + IntToStr(god) + ' AND n.mes = ' + IntToStr(mes) + ' ' +
   'GROUP BY n.id, j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo, s1.summa, n.summa, s2.summa;';
 DMQ.ADODS.Parameters.ParseSQL(DMQ.ADODS.CommandText, true);
 DMQ.ADODS.Open;

Вот запрос, который возвращает пустую выборку (этот запрос отличается от первоначального только тем, что два “+IntToStr(…)+” я заменил на параметры – в коде я их выделил жирным шрифтом):

 DMQ.ADODS.Active := false;
 DMQ.ADODS.CommandText :=
   'SELECT j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo AS FIO, s1.summa AS s1_summa, n.summa AS n_summa, sum(o.summa) AS sum_o_summa, s2.summa AS s2_summa ' +
   'FROM (((nachisl AS n ' +
   'LEFT JOIN jilci AS j ON (j.id = n.IDJilci AND j.IDDoma = :PIDDoma)) ' +
   'LEFT JOIN saldo AS s1 ON (s1.IDJilci = n.IDJilci AND s1.god = ' + IntToStr(god) + ' AND s1.mes = ' + IntToStr(mes) + ')) ' +
   'LEFT JOIN saldo AS s2 ON (s2.IDJilci = n.IDJilci AND s2.god = ' + IntToStr(NextGod) + ' AND s2.mes = ' + IntToStr(NextMes) + ')) ' +
   'LEFT join oplati AS o ON (o.IDJilci = n.IDJilci AND o.god = ' + IntToStr(god) + ' AND o.mes = ' + IntToStr(mes) + ') ' +
   'WHERE n.god = :PNGod AND n.mes = ' + IntToStr(mes) + ' ' +
   'GROUP BY n.id, j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo, s1.summa, n.summa, s2.summa;';
 DMQ.ADODS.Parameters.ParseSQL(DMQ.ADODS.CommandText, true);
 with DMQ.ADODS.Parameters.ParamByName('PIDDoma') do
 begin
   DataType := ftInteger;
   Direction := pdInput;
   Value := id;
 end;
 with DMQ.ADODS.Parameters.ParamByName('PNGod') do
 begin
   DataType := ftInteger;
   Direction := pdInput;
   Value := god;
 end;  

Если параметрами заменить не оба, а только один из “+IntToStr(…)+”, то запрос опять начнет работать правильно, возвращая 3 строки.

Подскажите, пожалуйста, в чем здесь  ошибка? Скорее всего, это я что-то сделал не так, но, может быть, это все же Access или ADO?

Заранее спасибо.


12   (2010-08-10 09:29:00) [21]

попробуй пробелы везде добавить

>  '[сюда]FROM (((nachisl AS n ' +
>    '[сюда]LEFT JOIN jilci AS j ON (j.id = n.IDJilci AND j.IDDoma

или подсветить окончательный sql в мемо, перетащить в А и выполнить

идея два
Все это
with DMQ.ADODS.Parameters.ParamByName('PNGod') do
begin
  DataType := ftInteger;
  Direction := pdInput;
  Value := god;
end;

переписать просто как  DMQ.ADODS.Parameters.ParamByName('PNGod').Value := god;


sniknik   (2010-08-10 09:28:00) [22]

> DMQ.ADODS.Parameters.ParseSQL(DMQ.ADODS.CommandText, true);
эта строка в обоих случаях лишняя. в первом параметров нет, во втором есть но не отключено (не показано) авто определение. т.е. в одном случае работает вхолостую, в втором (судя по результату) создает дополнительный набор параметров.

> DataType := ftInteger;
> Direction := pdInput;
это тоже лишнее, тип получается из варианта т.е. присвоение Value := id; если id интеджер даст нужный тип. (вот если бы оно было строкой (?), то предварительное указание типа приведет к конвертации при присвоении другого. насколько помню)


И. Павел   (2010-08-10 09:24:00) [23]

> а
> DMQ.ADODS.Open; есть во второй раз?

Да, есть. Я просто забыл его указать.


12   (2010-08-10 09:22:00) [24]

тупое уточнение, а
DMQ.ADODS.Open; есть во второй раз?


И. Павел   (2010-08-10 09:14:00) [25]

Здравствуйте.
Я работаю с Access в Delphi 7 через ADO, JET.
Первоначальный запрос (SELECT с несколькими LEFT JOIN) выполняется нормально и возвращает 3 записи. Если заменить прямую подстановку двух чисел в строку запроса (с помощью “+ IntToStr(…) +”) на параметры, то запрос возвращает пустую выборку (но если использовать любой из этих двух параметров, а второй IntToStr оставить, то запрос опять будет работать правильно).

Вот первоначальный запрос (он выполняется нормально – возвращает 3 записи):

 DMQ.ADODS.Active := false;
 DMQ.ADODS.CommandText :=
   'SELECT j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo AS FIO, s1.summa AS s1_summa, n.summa AS n_summa, sum(o.summa) AS sum_o_summa, s2.summa AS s2_summa ' +
   'FROM (((nachisl AS n ' +
   'LEFT JOIN jilci AS j ON (j.id = n.IDJilci AND j.IDDoma = ' + IntToStr(id) + ')) ' +
   'LEFT JOIN saldo AS s1 ON (s1.IDJilci = n.IDJilci AND s1.god = ' + IntToStr(god) + ' AND s1.mes = ' + IntToStr(mes) + ')) ' +
   'LEFT JOIN saldo AS s2 ON (s2.IDJilci = n.IDJilci AND s2.god = ' + IntToStr(NextGod) + ' AND s2.mes = ' + IntToStr(NextMes) + ')) ' +
   'LEFT join oplati AS o ON (o.IDJilci = n.IDJilci AND o.god = ' + IntToStr(god) + ' AND o.mes = ' + IntToStr(mes) + ') ' +
   'WHERE n.god = ' + IntToStr(god) + ' AND n.mes = ' + IntToStr(mes) + ' ' +
   'GROUP BY n.id, j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo, s1.summa, n.summa, s2.summa;';
 DMQ.ADODS.Parameters.ParseSQL(DMQ.ADODS.CommandText, true);
 DMQ.ADODS.Open;


Вот запрос, который возвращает пустую выборку (этот запрос отличается от первоначального только тем, что два “+IntToStr(…)+” я заменил на параметры – в коде я их выделил жирным шрифтом):

 DMQ.ADODS.Active := false;
 DMQ.ADODS.CommandText :=
   'SELECT j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo AS FIO, s1.summa AS s1_summa, n.summa AS n_summa, sum(o.summa) AS sum_o_summa, s2.summa AS s2_summa ' +
   'FROM (((nachisl AS n ' +
   'LEFT JOIN jilci AS j ON (j.id = n.IDJilci AND j.IDDoma = :PIDDoma)) ' +
   'LEFT JOIN saldo AS s1 ON (s1.IDJilci = n.IDJilci AND s1.god = ' + IntToStr(god) + ' AND s1.mes = ' + IntToStr(mes) + ')) ' +
   'LEFT JOIN saldo AS s2 ON (s2.IDJilci = n.IDJilci AND s2.god = ' + IntToStr(NextGod) + ' AND s2.mes = ' + IntToStr(NextMes) + ')) ' +
   'LEFT join oplati AS o ON (o.IDJilci = n.IDJilci AND o.god = ' + IntToStr(god) + ' AND o.mes = ' + IntToStr(mes) + ') ' +
   'WHERE n.god = :PNGodAND n.mes = ' + IntToStr(mes) + ' ' +
   'GROUP BY n.id, j.kvartira, j.schet, j.familia + '' '' + j.imia + '' '' + j.otchestvo, s1.summa, n.summa, s2.summa;';
 DMQ.ADODS.Parameters.ParseSQL(DMQ.ADODS.CommandText, true);
 with DMQ.ADODS.Parameters.ParamByName('PIDDoma') do
 begin
   DataType := ftInteger;
   Direction := pdInput;
   Value := id;
 end;
 with DMQ.ADODS.Parameters.ParamByName('PNGod') do
 begin
   DataType := ftInteger;
   Direction := pdInput;
   Value := god;
 end;  


Если параметрами заменить не оба, а только один из “+IntToStr(…)+”, то запрос опять начнет работать правильно, возвращая 3 строки.

Подскажите, пожалуйста, в чем здесь  ошибка? Скорее всего, это я что-то сделал не так, но, может быть, это все же Access или ADO?

Заранее спасибо.

PS: уважаемые администраторы, удалите, пожалуйста, первый мой пост. Я там забыл отформатировать код.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо