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