Войти

Показать полную графическую версию : Ошибка Invalid Parameter!!!


LilLoco
14-09-2010, 14:45
Люди, помогите пожалуйста!Выскакивает ошибка Invalid Parameter при выполнении запроса выбора данных!приблизительный код :


query1.Close;
query1.SQL.Add(тут что то выбираем);
query1.open;
//выполняем цикл по всему выбранному
while not query1.eof do
begin
........................... //что нибудь делаем
query2.close;
query2.SQL.Add('SELECT A FROM " ' + dir + ' " where B = 100 ')
(*) query2.open;
.................... //что нибудь делаем
query2.close;
...........................//что нибудь делаем
query1.next;
end;


при выполнении данного куска, на строке (*) вылетает ошибка!
dir - константа,указывающая таблицу!


const dir : string = 'D:\aaa.dbf';


Но вот ищо один момент, если в строке (*), в запрос вбить все не используя переменные и константы :


query2.SQL.Add('SELECT A FROM " D:\aaa.dbf " where B = 100 ')


то все хорошо обрабатывается, и никаких ошибок! в чем причина этого???раньше такого не было в других кусках кода, почти идентичных этому!

посмотрел строку sql - запроса перед его выполнением, она почему то имеет такой вид :



'SELECT A FROM "" WHERE B = 100'#$D#$A

Alan85
14-09-2010, 21:45
попробуй так:
query2.SQL.Add(Format('SELECT A FROM " %s " where B = 100 ', [dir]);

LilLoco
15-09-2010, 07:45
Alan85, Спасибо за вариант, но с ним тоже, увы, строка запроса имеет такой же вид, и запрос не выполняется :(

SoundHorror
15-09-2010, 13:36
1. Попробуйте задавать ваш dir сразу с двойными кавычками

const dir = ' "D:\aaa.dbf" '

Тогда будет так:
query2.SQL.Add('SELECT A FROM '+dir+' where B = 100 ')

2. Если перед выполнением запроса Вы видите это:
'SELECT A FROM "" WHERE B = 100'#$D#$A
то возвожно Вы определили где-то локальную переменную dir и перекрыли ей константу. Именно в этом случае получите 'invalid parameter'
Если объявляли константу с двойными кавычками сразу, то получите другое сообщение об ошибке.

SoundHorror
15-09-2010, 14:04
Вот пример перекрытия константы.

LilLoco
15-09-2010, 15:02
то возвожно Вы определили где-то локальную переменную dir и перекрыли ей константу. Именно в этом случае получите 'invalid parameter' »
Это проверил первым же делом, таких совпадений не нашел!!!
Попробовал, сообщение Invalid Use of keyword WHERE....!запрос выглядит так :

'SELECT A FROM WHERE B = 100'#$D#$A

Почему то строка запроса вообще не воспринимает констант и переменных!даже если делать так :


B := '100' //переменная типа string
query2.SQL.Add('SELECT A FROM " ' + dir + ' " WHERE B = ' + B);


то вид имеет такой :


'SELECT A FROM " " WHERE B = '#$D#$A


и даже если так :


strQuery := 'SELECT A FROM "D:\aaa.dbf" WHERE B = 100';
query2.SQL.Add(strQuery);


строка подключения вообще пустая!

SoundHorror
15-09-2010, 15:19
выложите свой код, и версию среды укажите. Query стандартный от BDE? Этот пример (см.вложние) у Вас работает?

SoundHorror
15-09-2010, 15:52
Есть еще одна бредовая мысль, но ввиду отсутствия других вариантов я ее выскажу:
Может в каком-нибудь используемом модуле переопределен тип String так чтобы длина постоянно была равна нулю?

LilLoco
15-09-2010, 16:04
Может в каком-нибудь используемом модуле переопределен тип String так чтобы длина постоянно была равна нулю? »
Нет такого нет ничего!

Работает все почему то кроме этого куска кода!
Вот что еще оказывается :

в этом куске кода query2 создается программно! попробовал добавить на форму Query( Query3), и поменял query2 на query3, все нормально обрабатывается и выполняется!Может ли это быть каким либо багом?Еще люди советуют перезагрузить комп, может ли это влиять? :dont-know
З.Ы. Комп работает уже дня 3 - 4, и среда тоже!

SoundHorror
15-09-2010, 16:15
Дайте же посмотреть этот кусок кода от места где Query2 создается программно до его открытия. Может там чего и намудрили? Чудес в коде не бывает.

LilLoco
15-09-2010, 16:29
query := TQuery.Create(nil);
query2 := TQuery.Create(nil);
opentable2(table,TEMP_PROMBASE);
SelectWhere(query,'DISTINCT*',TKMEH,'zakaz = ' + zakaz + ' and xkb59 = "' + detal + '"');
while not query.Eof do
begin
table.Insert;
table.FieldByName('zakaz').AsString := query.FieldByName('zakaz').AsString;
table.FieldByName('detal').AsString := query.FieldByName('xkb59').AsString;
table.FieldByName('kolvo').AsString := IntToStr(Count);
table.FieldByName('oper').AsString := query.FieldByName('noper').AsString;
table.FieldByName('cex').AsString := Copy(query.FieldByName('zehus').AsString,0,2);
shifr := query.FieldByName('xko99').AsString;
table.FieldByName('shifr').AsString := shifr;
if ((Length(shifr) = 2) or (Length(shifr) = 3)) then
begin
table.FieldByName('norma').AsString := query.FieldByName('norma').AsString;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('SELECT DISTINCT KPZV FROM "' + PZV + '" WHERE KODOB = ' + shifr);
query2.Open; //ошибка на этой строчке
table.FieldByName('pzv').AsString := query2.FieldByName('KPZV').AsString;
query2.Close;
..............................




Вот кусок кода :)))

Alan85
15-09-2010, 17:30
а если так:
query2.SQL.Add('SELECT DISTINCT KPZV FROM "' + PZV + '");

query2.SQL.Add('WHERE KODOB = ' + shifr);

SoundHorror
15-09-2010, 17:55
Это должно работать. У меня работает. Больше вариантов нету. Но появился вопрос. Если у меня есть запрос, в котором 60 параметров, и на этапе выполнения ExecSql я получаю ошибку - invalid parameter, то как мне узнать какой именно параметр не в порядке?

LilLoco
16-09-2010, 07:33
Alan85, тоже не помогает!

Дело еще, оказывается, в том, что этот код не работает на определенном компе, пробовал на других все работает отлично!и вдобавок, не работает тока с созданными в коде query!пока что заменил на query, добавленный визуально, но все равно буду разбираться дальше!всем большое спасибо, за помощь!




© OSzone.net 2001-2012