Показать полную графическую версию : Ошибка Invalid Parameter!!!
Люди, помогите пожалуйста!Выскакивает ошибка 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
попробуй так:
query2.SQL.Add(Format('SELECT A FROM " %s " where B = 100 ', [dir]);
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
Вот пример перекрытия константы.
то возвожно Вы определили где-то локальную переменную 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 так чтобы длина постоянно была равна нулю?
Может в каком-нибудь используемом модуле переопределен тип String так чтобы длина постоянно была равна нулю? »
Нет такого нет ничего!
Работает все почему то кроме этого куска кода!
Вот что еще оказывается :
в этом куске кода query2 создается программно! попробовал добавить на форму Query( Query3), и поменял query2 на query3, все нормально обрабатывается и выполняется!Может ли это быть каким либо багом?Еще люди советуют перезагрузить комп, может ли это влиять? :dont-know
З.Ы. Комп работает уже дня 3 - 4, и среда тоже!
SoundHorror
15-09-2010, 16:15
Дайте же посмотреть этот кусок кода от места где Query2 создается программно до его открытия. Может там чего и намудрили? Чудес в коде не бывает.
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;
..............................
Вот кусок кода :)))
а если так:
query2.SQL.Add('SELECT DISTINCT KPZV FROM "' + PZV + '");
query2.SQL.Add('WHERE KODOB = ' + shifr);
SoundHorror
15-09-2010, 17:55
Это должно работать. У меня работает. Больше вариантов нету. Но появился вопрос. Если у меня есть запрос, в котором 60 параметров, и на этапе выполнения ExecSql я получаю ошибку - invalid parameter, то как мне узнать какой именно параметр не в порядке?
Alan85, тоже не помогает!
Дело еще, оказывается, в том, что этот код не работает на определенном компе, пробовал на других все работает отлично!и вдобавок, не работает тока с созданными в коде query!пока что заменил на query, добавленный визуально, но все равно буду разбираться дальше!всем большое спасибо, за помощь!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.