![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Два почти одинаковых запроса выполняются по разному
И. Павел © (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: уважаемые администраторы, удалите, пожалуйста, первый мой пост. Я там забыл отформатировать код.