Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 174

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Срочно нуждаюсь в помощи
Никак не могу выполнить запрос на вставку записей в таблицу.
Делфи выдает ошибку
" Ошибка в синтаксиса в инструкции INSERT INTO' "
Код в приложении

Приложение:
  1. DM ->DataModule
  2.  
  3.  
  4.  
  5. DM.sql.SQL.Clear;
  6. DM.sql.SQL.Add('insert into employee(fio,phone,city,road,model,number)' );
  7. DM.sql.SQL.Add('values("'+le1.Text+'","'+le2.text+'","'+le3.text+'","' +le4.text+'","'+le5.text+'","'+le6.text+'")');
  8.  


Anderson N.N Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

BurcevD (статус: Посетитель), 9 декабря 2008, 11:10 [#3]:

просто вместо двойных кавычек используй символ #39 (Это апостроф или одинарная кавычка) а так все нормуль
Вадим К

Вадим К (статус: Академик), 9 декабря 2008, 11:20 [#4]:

Где, BurcevD?
А удвоить одинарную кавычку уже не модно?
Но если одинарная кавычка не помогает, то и #39 не поможет.
Галочка "подтверждения прочтения" - вселенское зло.
BurcevD

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

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 повторяется.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 2 апреля 2020, 03:49
Выполнено за 0.02 сек.
Рейтинг@Mail.ru