| 
| 
 | Вопрос # 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 повторяется.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |