![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SELECT не работает [D6, Paradox]
Аня © (2003-07-18 08:36:00)Помогите!!! Переношу информацию из текстового файла в базу, при этом добавляется два вычисляемых поля, т.е. последовательность запросов в цикле по строкам файла такая: SELECT, SELECT, INSERT. В таком виде программа работает только на 764 строки, но работает правильно. Если закоментарить один из селектов, всё равно какой, то переносятся 1528 строк. А если убрать оба селекта, тогда всё работает до конца файла, но конечно же без вычисляемых полей. Ошибка выдаётся "Invalid parameter." Что за ерунда?
VAleksey (2003-07-18 13:21:00) [1]Мда...
> Видимо, Paradox кривой...
Нечего на зеркало пенять ... ;-)
ЗЫ
Господа, ну прекратите наконец винить в своих ошибках Windows, Borland, Paradox и т.д. !!!
ЗЗЫ
Сорри за эмоции. Просто надо разбираться что к чему. А если у тебя на PostgreSQL будет какая - нибудь ошибка, то что ты будешь делать? Видимо переходить на Oracle ...
ЮЮ (2003-07-18 13:04:00) [2]Может Paradox слишко близко и не поспевал за тобой в цикле перекраивать TQuery? Попробуй его тоже заменить на параметрический с Prepare, а затем уж гнать в бешенном цикле.
Аня (2003-07-18 12:59:00) [3]Спасибо всем, но ничего не помогло. Как ни странно, поменяв базу данных (благо нахожусь в самом начале большого процесса программирования)на PostgreSQL на удалённой машине, этот же код заработал в полную силу. Видимо, Paradox кривой...
VAleksey (2003-07-18 10:52:00) [4]Эта.. Ты вот чего, try except умеешь пользоваться?
Так вот в блоке
Excep
End;
Сохрани куда - нибудь текст запроса и посмотри его.. и нам потом дай посмотреть.
Соловьев (2003-07-18 10:00:00) [5]
> Аня (18.07.03 09:13)
смысл этого цыкла?
ЮЮ (2003-07-18 09:55:00) [6]В конце-концов, поставь break point для i = 1528 и посмотри где падает
ЮЮ (2003-07-18 09:48:00) [7]Посмотри нет ли каких обработчиков у qOp. Может причина кроется где-то там. Ведт не случайно падает на одном и том же числе
Аня (2003-07-18 09:41:00) [8]Спасибо за разъяснения по поводу двоеточия. Попробую переделать.
Но проблема всё-таки в селекте. Он не хочет работать более 1528 раз, даже когда нет в нём никакой привязки к переменным...
ЮЮ (2003-07-18 09:40:00) [9]Хотя то, что "Запрос становится "параметризованным" - это наверноя я через край хватил, но наличие символа " в любой переменной точно превратит твой запрос в ерунду
ЮЮ (2003-07-18 09:32:00) [10]>А что, символ ":" как-то влияет на выполнение запроса?
Запрос становится "параметризованным"
Лучше самой сделать действительно параметризованный запрос: и работать будет быстрее и лишних ошибок избежишь
До цикла:
qInsert.SQL.Clear;
qInsert.SQL.Add("INSERT INTO BILLING VALUES");
qInsert.SQL.Add("( :d,:t, :ani, :tin, :dial, :tout, :du, :pin)");
qInsert.Prepare;
в цикле
qInsert.Params[0].asString := d;
...
qInsert.Params[7].asString := pin;
qInsert.ExecSQL;
Ann (2003-07-18 09:32:00) [11]
> ЮЮ © (18.07.03 09:24)
> >полностью согласна! :)
> откуда же взялось это 1528 ?
это не я запостила.. :)
просто тезки..
Аня (2003-07-18 09:25:00) [12]Извиняюсь, 10000.
А что, символ ":" как-то влияет на выполнение запроса? Тем более, если убрать все селекты, переменные opin и opout и соответствующие им поля, то всё работает правильно...
ЮЮ (2003-07-18 09:24:00) [13]>полностью согласна! :)
откуда же взялось это 1528 ?
Ann (2003-07-18 09:20:00) [14]
> ЮЮ © (18.07.03 09:17)
> Точно фигня! Не должно болеше 1000 раза :-)
полностью согласна! :)
ЮЮ (2003-07-18 09:17:00) [15]>for i:=1 to 1000do
>то тоже отрабатывает только 1528раз
Точно фигня! Не должно болеше 1000 раза :-)
Аня (2003-07-18 09:13:00) [16]Типы полей соответствуют, иначе как бы первые 1528 или 764 раза всё правильно сработало бы...
Ещё повторю, если написать:
for i:=1 to 1000 do
begin
qOp.Close;
qOp.SQL.Clear;
qOp.SQL.Add("SELECT ID FROM OPERATORS WHERE TRUNC="+""""+"810"+"""");
qOp.Open;
end;
то тоже отрабатывает только 1528 раз. Что это за фигня?
ЮЮ (2003-07-18 09:10:00) [17]Честно говоря, не вижу не одной строчки, которая бы вызывала "Invalid parameter.". Если только в переменных d,t,...,opout вдруг оказался текст, содержащий символ :
Поставь проверку
if Pos(":", qInsert.SQL.Text) > 0 then
Raise Exception.Create(qInsert.SQL.Text)
else
qInsert.ExecSQL;
Johnmen (2003-07-18 09:06:00) [18]Видимо, по одному из селектов ничего не возвращается на 1528 шаге при текущих значениях tin или tout...
Наталия (2003-07-18 09:00:00) [19]Типы полей соответствуют вставляемым значениям?
Аня (2003-07-18 08:53:00) [20]Жалеть не надо. Объяснил бы кто-нибудь начинающей...
А кусочек кода вот:
qOp.Close;
qOp.SQL.Clear;
qOp.SQL.Add("SELECT ID FROM OPERATORS WHERE TRUNC="+""""+tin+"""");
qOp.Open;
opin:=qOp.FieldValues["id"];
qOp.Close;
qOp.SQL.Clear;
qOp.SQL.Add("SELECT ID FROM OPERATORS WHERE TRUNC="+""""+tout+"""");
qOp.Open;
opout:=qOp.FieldValues["id"];
qInsert.Close;
qInsert.SQL.Clear;
qInsert.SQL.Add("INSERT INTO BILLING VALUES");
qInsert.SQL.Add("("+""""+d+""""+","+""""+t+""""+","+""""+ani+""""+","+""""+tin+""""+","+""""+dial+""""+","+""""+tout+""""+","+""""+du+""""+","+""""+pin+""""+")");
qInsert.SQL.Add(","+""""+opin+""""+","+""""+opout+""""+")");
qInsert.ExecSQL;
Самое интересное, что если в цикле оставить один селект и вместо переменной поставить конкретное значение, то ошибка всё равно появляется на 1528 раз выполнения цикла.