Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизSELECT не работает Найти похожие ветки
← →
Аня (2003-07-18 08:36) [0]Помогите!!! Переношу информацию из текстового файла в базу, при этом добавляется два вычисляемых поля, т.е. последовательность запросов в цикле по строкам файла такая: SELECT, SELECT, INSERT. В таком виде программа работает только на 764 строки, но работает правильно. Если закоментарить один из селектов, всё равно какой, то переносятся 1528 строк. А если убрать оба селекта, тогда всё работает до конца файла, но конечно же без вычисляемых полей. Ошибка выдаётся "Invalid parameter." Что за ерунда?
← →
Наталия (2003-07-18 08:40) [1]Код покажи.
← →
ЮЮ (2003-07-18 08:41) [2]И что, приведенный текст можно рассматривать как исходник и пытаться найти ошибку? Или ты просто поделилась впечатлениями и хочешь, чтобы тебя подалели?
← →
Аня (2003-07-18 08:53) [3]Жалеть не надо. Объяснил бы кто-нибудь начинающей...
А кусочек кода вот:
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 раз выполнения цикла.
← →
Наталия (2003-07-18 09:00) [4]Типы полей соответствуют вставляемым значениям?
← →
Johnmen (2003-07-18 09:06) [5]Видимо, по одному из селектов ничего не возвращается на 1528 шаге при текущих значениях tin или tout...
← →
ЮЮ (2003-07-18 09:10) [6]Честно говоря, не вижу не одной строчки, которая бы вызывала "Invalid parameter.". Если только в переменных d,t,...,opout вдруг оказался текст, содержащий символ :
Поставь проверку
if Pos(":", qInsert.SQL.Text) > 0 then
Raise Exception.Create(qInsert.SQL.Text)
else
qInsert.ExecSQL;
← →
Аня (2003-07-18 09:13) [7]Типы полей соответствуют, иначе как бы первые 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:17) [8]>for i:=1 to 1000 do
>то тоже отрабатывает только 1528 раз
Точно фигня! Не должно болеше 1000 раза :-)
← →
Ann (2003-07-18 09:20) [9]
> ЮЮ © (18.07.03 09:17)
> Точно фигня! Не должно болеше 1000 раза :-)
полностью согласна! :)
← →
ЮЮ (2003-07-18 09:24) [10]>полностью согласна! :)
откуда же взялось это 1528 ?
← →
Аня (2003-07-18 09:25) [11]Извиняюсь, 10000.
А что, символ ":" как-то влияет на выполнение запроса? Тем более, если убрать все селекты, переменные opin и opout и соответствующие им поля, то всё работает правильно...
← →
ЮЮ (2003-07-18 09:32) [12]>А что, символ ":" как-то влияет на выполнение запроса?
Запрос становится "параметризованным"
Лучше самой сделать действительно параметризованный запрос: и работать будет быстрее и лишних ошибок избежишь
До цикла:
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) [13]
> ЮЮ © (18.07.03 09:24)
> >полностью согласна! :)
> откуда же взялось это 1528 ?
это не я запостила.. :)
просто тезки..
← →
ЮЮ (2003-07-18 09:40) [14]Хотя то, что "Запрос становится "параметризованным" - это наверноя я через край хватил, но наличие символа " в любой переменной точно превратит твой запрос в ерунду
← →
Аня (2003-07-18 09:41) [15]Спасибо за разъяснения по поводу двоеточия. Попробую переделать.
Но проблема всё-таки в селекте. Он не хочет работать более 1528 раз, даже когда нет в нём никакой привязки к переменным...
← →
ЮЮ (2003-07-18 09:48) [16]Посмотри нет ли каких обработчиков у qOp. Может причина кроется где-то там. Ведт не случайно падает на одном и том же числе
← →
ЮЮ (2003-07-18 09:55) [17]В конце-концов, поставь break point для i = 1528 и посмотри где падает
← →
Соловьев (2003-07-18 10:00) [18]
> Аня (18.07.03 09:13)
смысл этого цыкла?
← →
VAleksey (2003-07-18 10:52) [19]Эта.. Ты вот чего, try except умеешь пользоваться?
Так вот в блоке
Excep
End;
Сохрани куда - нибудь текст запроса и посмотри его.. и нам потом дай посмотреть.
← →
Аня (2003-07-18 12:59) [20]Спасибо всем, но ничего не помогло. Как ни странно, поменяв базу данных (благо нахожусь в самом начале большого процесса программирования)на PostgreSQL на удалённой машине, этот же код заработал в полную силу. Видимо, Paradox кривой...
← →
ЮЮ (2003-07-18 13:04) [21]Может Paradox слишко близко и не поспевал за тобой в цикле перекраивать TQuery? Попробуй его тоже заменить на параметрический с Prepare, а затем уж гнать в бешенном цикле.
← →
VAleksey (2003-07-18 13:21) [22]Мда...
> Видимо, Paradox кривой...
Нечего на зеркало пенять ... ;-)
ЗЫ
Господа, ну прекратите наконец винить в своих ошибках Windows, Borland, Paradox и т.д. !!!
ЗЗЫ
Сорри за эмоции. Просто надо разбираться что к чему. А если у тебя на PostgreSQL будет какая - нибудь ошибка, то что ты будешь делать? Видимо переходить на Oracle ...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c