Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
ВнизДобавление записи в Oracle Найти похожие ветки
← →
David (2003-02-06 15:39) [0]Есть простая таблица с одним полем типа Number. При добавлении записи динамическим SQL параметрами возникает исключительная ситуация. Код программы:
with SqlQuery do begin
SQL.Clear;
SQL.Add("INSERT INTO testlog (logid) VALUES (:idval)");
Params.Clear;
Params.CreateParam(ftInteger, "idval", ptInput);
Params.ParamByName("idval").Value := 1;
try
ExecSQL();
except
........
end;
end;
Если добавляю запись с переменной типа String в таблицу с полем типа Char, то все проходит нормально. Заранее благодарен за любые советы.
← →
Reindeer Moss Eater (2003-02-06 15:43) [1]with SqlQuery do begin
SQL.Clear;
SQL.Add("INSERT INTO testlog (logid) VALUES (:idval)");
ParamByName("idval").Value := 1;
try
ExecSQL();
except
........
end;
end;
← →
Danilka (2003-02-06 16:01) [2]with SqlQuery do begin
SQL.text:="INSERT INTO testlog (logid) VALUES ("+inttostr(1)+")";
try
ExecSQL();
except
........
end;
end;
← →
Duce (2003-02-06 16:16) [3]пРОДОЛЖАЯ Данилку ;)
Так, по-моему, и вернее и быстрее и легче будет - динамически
собирать полную строку СКЛ...если ситуация позволяет.
← →
David (2003-02-06 16:17) [4]Если написать без параметров как Danilka, то все работает, но хотелось бы знать как реализовать параметрический SQL. К сожалению, вариант Reindeer Moss Eater тоже не функционирует.
← →
Reindeer Moss Eater (2003-02-06 16:20) [5]К сожалению никто из не знает что такое у тебя SqlQuery
← →
dimis (2003-02-06 16:25) [6]
> Reindeer Moss Eater (06.02.03 16:20)
> К сожалению никто из не знает что такое у тебя SqlQuery
и что за ошибка
← →
David (2003-02-06 16:38) [7]Прошу прощения. SqlQuery имеет тип TSQLQuery. Я использую dbExpress. Ошибка: Invalid field type.
← →
Reindeer Moss Eater (2003-02-06 16:47) [8]Сдается мне, что параметрический запрос заработал, и в ошибке виноват не он
← →
passm (2003-02-06 16:55) [9]Тип указан?
ParamByName("idval").DataType:= ...
ParamByName("idval").Value:= ...
← →
David (2003-02-06 17:06) [10]Одинаково не работает и с указанием типа
ParamByName("idval").DataType := ftInteger и без указания. Я тоже склоняюсь к тому, что причина не в SQL, т.к. с Paradox все работает без проблем.
← →
Sergey13 (2003-02-07 09:30) [11]2David (06.02.03 16:38)
>Ошибка: Invalid field type.
Так это делфовая ошибка или оракловая вываливается?
2Duce © (06.02.03 16:16)
>Так, по-моему, и вернее и быстрее и легче будет - динамически
собирать полную строку СКЛ...если ситуация позволяет.
Это тебе проще, а серверу труднее. 8-(
← →
Danilka (2003-02-07 10:06) [12]Sergey13 © (07.02.03 09:30)
>Это тебе проще, а серверу труднее. 8-(
серьезно?
интересно, почему ему сразу получить и обработать полноценный скуль труднее, чем получить сначала его урезаную версию, как-бы сообщение, типа, "извиняйте, что не сказала вам все сразу чего от вас хотела. а сейчас я вам еще буду параметры по-очереди отдавать", потом получить параметры, а потом уже обработать все это одной кучей?
← →
Johnny Smith (2003-02-07 10:15) [13]2Danilka © (07.02.03 10:06)
Так вот, докладываю: после того, как ты передал запрос на сервер, он там компилируется.
Если есть параметры, то при повторном вызове запроса он НЕ ПЕРЕКОМПИЛИРУЕТСЯ, а просто ставит значения параметров в готовый скомпиленный запрос.
Если же передавать текст запроса каждый раз по-новому, то он каждый раз будет компилироваться, т.е. это - просто-напросто излишняя нагрузка на сервер.
← →
Sergey13 (2003-02-07 10:18) [14]2Danilka © (07.02.03 10:06)
>серьезно?
Абсолютно. Если этот запрос работает много раз, то при склеивании SQLпредложения сервер каждый раз проверяет его и компилит. А в случае с переменными он просто биндует их и выполняет. Т.е. исключается парсинг.
← →
Danilka (2003-02-07 10:26) [15]Johnny Smith © (07.02.03 10:15)
Sergey13 © (07.02.03 10:18)
:))
все ясно.
правда, парсинг такого запроса займет времени гораздо меньше, чем лишнее "общение" клиента с сервером.
← →
Sergey13 (2003-02-07 10:45) [16]2Danilka © (07.02.03 10:26)
>правда, парсинг такого запроса займет времени гораздо меньше, чем лишнее "общение" клиента с сервером.
Одного может быть. А если этот запрос отрабатывает несколько раз в секунду (там что то про LOG было вроде) - тогда ого-го сколько отожрет. Кроме того, каждый такой "новый" запрос отожрет несколько памяти в шаредпуле. Это конечно не очень страшно, но и хорошего тоже мало. Может выкидывать от туда действительно нужные запросы.
← →
David (2003-02-07 11:20) [17]2Sergey13
Если быть точным, то ошибка dbExpress, но это может быть реакцией на ошибку, которая произошла в Oracle. Не понимаю, почему это происходит с цифровыми параметрами, а со строковыми все в порядке?
2Danilka
Таблица, в которую заносятся данные, в самом деле, является как-бы логом с довольно большой нагрузкой. Кроме того, функции общения с БД вынесены в отдельную библиотеку, которая пишется под конкретную БД (Oracle, Paradox, ...). Основная программа, таким образом, от БД не зависит, ее дело только сформировать SQL и передать его с параметрами дальше. Поэтому и запрос параметрический.
← →
Sergey13 (2003-02-07 11:33) [18]2David (07.02.03 11:20)
Попробуй отработать этот запрос в чем нибудь другом, хоть в плюсе, или ПЛ/СКЛ Дивелопере. С именами схем не может быть проблем? Убери try except -пусть прога ругнется по настоящему. 8-) Какой то код у ошибки должен быть, и на этот код какое то описание наверно существует.
← →
David (2003-02-07 11:44) [19]Невероятно, но факт. Если параметр определить как строковый, т.е.
Params.ParamByName("idval").DataType := ftString;
Params.ParamByName("idval").Value := 1;
то все работает. Кто бы мог подумать. Что касается сообщения, то оно такое и есть: dbExpress error: Invalid field type. Может у dbExpress свои типы для параметров?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c