|
Вопрос # 2 174/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Срочно нуждаюсь в помощи
Никак не могу выполнить запрос на вставку записей в таблицу.
Делфи выдает ошибку
" Ошибка в синтаксиса в инструкции INSERT INTO' "
Код в приложении
Приложение: Переключить в обычный режим- DM ->DataModule
-
-
-
- DM.sql.SQL.Clear;
- DM.sql.SQL.Add('insert into employee(fio,phone,city,road,model,number)' );
- DM.sql.SQL.Add('values("'+le1.Text+'","'+le2.text+'","'+le3.text+'","'
+le4.text+'","'+le5.text+'","'+le6.text+'")');
-
 |
Вопрос задал: Anderson N.N (статус: 2-ой класс)
Вопрос отправлен: 7 декабря 2008, 23:14
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Anderson N.N!
Красивая задача. И решение оригинальное. Самое первое, что надо сделать в таком случае - попробовать вывести сформированный запрос в Memo или текстовый файл и посмотреть на него. Обычно там видно причину. А она обычно такая - незаэкраннированные кавычки. Для экранирования каычек я применяю такую функцию
function QStr(s:string): string;
var
I: Integer;
begin
Result := S;
for I := Length(Result) downto 1 do begin
if Result[I] = '`' then Result[I] := '''';
if Result[I] = '''' then Insert('''', Result, I);
if Result[I] = '"' then Insert('""', Result, I);
end;
Result := '''' + Result + '''';
end;
Все строковые параметры надо обрабатывать подобной функцией.
И второе, что бывает - это глюк АДО компонентов. если добавлять запросы по кусочкам, то движок АДО начинает потихоньку анализировать запрос. И можно так угадать, что анализатор начинает сходить с ума. Но с этим легко бороться - достаточно запрос сформировать в виде одной строки и добавить одним махом, где то так
ADOQuery1.sql.text := 'insert into .........';
Примените указанные выше два метода, и если не получиться и ошибка будет появляться дальше - скопируйте с мемо запрос и выложите в минифореме - там будет виднее.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 декабря 2008, 01:42
Оценка за ответ: 5
Комментарий к оценке: Но проблема оказалось в другом.
Но все равно спасибо
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 9 декабря 2008, 12:45; участников в обсуждении: 3.
|
Anderson N.N (статус: 2-ой класс), 9 декабря 2008, 00:01 [#1]:
Не знаю может делфи гоняет но не заработало
переделал тот же код вот так и опять та же ошибка
var s:string;
begin
s:='Insert Into employee(fio,phone,city,road,model,number) values';
s:=s+'values (:fio,:phone,:city,:road,:model,:number)';
ADOQuery1.sql.text:=s;
ADOQuery1.Parameters.ParamByName('fio').Value := le1.Text;
ADOQuery1.Parameters.ParamByName('phone').Value := le2.Text;
ADOQuery1.Parameters.ParamByName('city').Value := le3.Text;
ADOQuery1.Parameters.ParamByName('road').Value := le4.Text;
ADOQuery1.Parameters.ParamByName('model').Value := le5.Text;
ADOQuery1.Parameters.ParamByName('number').Value := le6.Text;
ADOQuery1.ExecSQL;
end;
может я с параметрами что то не так делаю ?
А может другим компонентом воспользоваться ...
|
|
Вадим К (статус: Академик), 9 декабря 2008, 00:26 [#2]:
а с какой стати, слово values дважды повторяется?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BurcevD (статус: Посетитель), 9 декабря 2008, 11:10 [#3]:
просто вместо двойных кавычек используй символ #39 (Это апостроф или одинарная кавычка) а так все нормуль
|
|
Вадим К (статус: Академик), 9 декабря 2008, 11:20 [#4]:
Где, BurcevD?
А удвоить одинарную кавычку уже не модно?
Но если одинарная кавычка не помогает, то и #39 не поможет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BurcevD (статус: Посетитель), 9 декабря 2008, 11:36 [#5]:
DM ->DataModule
sql -> ADOQuery с вкладки ADO
le1 ..le6-> LabeвlEdit с вкладки Additional
DM.sql.SQL.Clear;
DM.sql.SQL.Add('insert into employee(fio,phone,city,road,model,number)' );
DM.sql.SQL.Add('values('#39+le1.Text+#39','#39 +le2.text+#39','#39+le3.text+#39','#39 +le4.text+#39','#39+le5.text+#39','#39+le6.text+#39')');
DM.sql.Open;
Пусть так попробует =)
|
|
Вадим К (статус: Академик), 9 декабря 2008, 12:05 [#6]:
Поднимите глава вверх и посмотрите внимательно на функцию, которую я давал.
А также напрягите малось извилины и попробуйте представить, что будет, если наприме фамилия или название города содержит кавычку.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BurcevD (статус: Посетитель), 9 декабря 2008, 12:29 [#7]:
Не прошло у него потому как два раза поставил Values вот и все. Посмотрите внимательнее последний код. ВОт он уже исправленный
var s:string;
begin
s:='Insert Into employee(fio,phone,city,road,model,number) '+
'values (:fio,:phone,:city,:road,:model,:number)';
ADOQuery1.sql.text:=s;
ADOQuery1.Parameters.ParamByName('fio').Value := le1.Text;
ADOQuery1.Parameters.ParamByName('phone').Value := le2.Text;
ADOQuery1.Parameters.ParamByName('city').Value := le3.Text;
ADOQuery1.Parameters.ParamByName('road').Value := le4.Text;
ADOQuery1.Parameters.ParamByName('model').Value := le5.Text;
ADOQuery1.Parameters.ParamByName('number').Value := le6.Text;
ADOQuery1.ExecSQL;
end;
|
|
Вадим К (статус: Академик), 9 декабря 2008, 12:45 [#8]:
Вы издеваетесь???
Зачем повторять то, что я уже писал выше???? Я писал о том, что слово values повторяется.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|