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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 814

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

Здравствуйте, эксперты!
Пытаюсь добавить новую запись в БД с помощью sql запроса ... но возникает ошибка : "Ошибка синтексиса в инструкции INSERT INTO"

Приложение:
  1. Query.Close;
  2. Query.SQL.Clear;
  3.  
  4. Query.ExecSQL;


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

Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 14 августа 2008, 10:53
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Танюшка!
Ошибка Ваша заключается в следующем:
При вставлении текстовых данных через SQL-запрос необходимы дополнительные кавычки.
Два метода:
1.
Query.SQL.Add('insert into Сотрудники (Табельный_номер,ФИО,Дата_рождения,Классность,Должность,стаж_в_АП,Серия,№_паспорта,Выдан,Дата_выдачи,Страна,Город/область,Улица,Дом,[Бригада №],образование,УНН) values ('''+Edit9.Text+''','''+Edit1.Text+''','''+MaskEdit1.Text+''','''+Edit10.Text+''','''+Edit11.Text+''','''+MaskEdit3.Text+''','''+Edit2.Text+''','''+Edit3.Text+''','''+Edit4.Text+''','''+MaskEdit2.Text+''','''+Edit5.Text+''','''+Edit6.Text+''','''+Edit7.Text+''','''+Edit8.Text+''','''+Edit12.Text+''','''+Edit13.Text+''','''+Edit14.Text+''')');
2. Но лучше попробовать использовать функцию QuotedStr(const S: string)
Т.е.QuotedStr(Edit1.Text) например
Эта функция сама добавляет необходимое число кавычек.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 14 августа 2008, 11:00
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Мережников Андрей

Здравствуйте, Танюшка!
Переименуйте поле Город/область во что-нибудь другое. Слэш воспринимается как знак деления. Переименйте поле №_паспорта. Нельзя начинать название поля с иного символа кроме как буквы или знака подчеркивания. На будущее - не используйте русские буквы, знаки деления и символ номера.
Рекомендуется для имени поля использовать только латинские буквы, знак подчеркивания и цифры. В противном случае возможны проблемы, которые можно решить. Но зачем создавать себе трудности, чтобы потом их героически преодолевать? :-)

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 14 августа 2008, 19:34


Мини-форум вопроса

Всего сообщений: 12; последнее сообщение — 18 августа 2008, 19:57; участников в обсуждении: 4.
Dron

Dron (статус: Студент), 14 августа 2008, 10:59 [#1]:

А вы уверены, что в таблице поле называется "[Бригада №]"? Именно с квадратными скобками? Да и знак номера я бы не стал использовать.
С уважением.
Танюшка

Танюшка (статус: Посетитель), 14 августа 2008, 11:04 [#2]:

что со скобками что без них.... и знак № здесь не причем.... все равно та же ошибка
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 14 августа 2008, 11:14 [#3]:

Кроме того, что я уже написал может возникнуть ошибка следующая: конструкция Query.SQL.Add(s:string) предусматривает добавление строки запроса длиною до 256 символов. У Вас же явно получится больше.
Для обхода я использую дополнительную переменную например txt_zapros: WideString в которую добавляю текст запроса поочереди, чтобы длина каждой добавляемой строки не превышала 256.
А потом просто
Query.SQL.Text:= txt_zapros;
Query.ExecSQL;
Танюшка

Танюшка (статус: Посетитель), 14 августа 2008, 11:21 [#4]:

я сделала так :
Query.SQL.Text:='insert into Сотрудники (Табельный_номер,ФИО,Дата_рождения,Классность,Должность,стаж_в_АП,Серия,№_паспорта,Выдан,Дата_выдачи,Страна,Город/область,Улица,Дом,Бригада,образование,УНН)'+
' values (QuotedStr(Edit9.Text),QuotedStr(Edit1.Text),'+
'QuotedStr(MaskEdit1.Text),QuotedStr(Edit10.Text),QuotedStr(Edit11.Text),QuotedStr(MaskEdit3.Text),QuotedStr(Edit2.Text),'+
'QuotedStr(Edit3.Text),QuotedStr(Edit4.Text),QuotedStr(MaskEdit2.Text),QuotedStr(Edit5.Text),QuotedStr(Edit6.Text),QuotedStr(Edit7.Text),QuotedStr(Edit8.Text),QuotedStr(Edit12.Text),QuotedStr(Edit13.Text),QuotedStr(Edit14.Text))';
Query.ExecSQL;
Но та же ожибка
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 14 августа 2008, 11:30 [#5]:

Для отладки попробуйте:
Query.SQL.Text:='insert into Сотрудники (Табельный_номер) values (''' + 'Edit9.Text' + ''')';
потом
Query.SQL.Text:='insert into Сотрудники (Табельный_номер) values (' + QuotedStr(Edit9.Text) + ')';

т.е. QuotedStr(Edit9.Text) должно быть отделено + с обеих сторон.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 14 августа 2008, 11:35 [#6]:

Строка по-моему выглядит так:
Query.SQL.Text:='insert into Сотрудники (Табельный_номер,ФИО,Дата_рождения,Классность,Должность,стаж_в_АП,Серия,№_паспорта,Выдан,Дата_выдачи,Страна,Город/область,Улица,Дом,Бригада,образование,УНН)'+
' values (' + QuotedStr(Edit9.Text) + ', ' + QuotedStr(Edit1.Text)+ ', ' +
QuotedStr(MaskEdit1.Text) + ', ' + QuotedStr(Edit10.Text) + ', ' + QuotedStr(Edit11.Text) + ', ' + QuotedStr(MaskEdit3.Text) + ', ' + QuotedStr(Edit2.Text) + ', ' + QuotedStr(Edit3.Text) + ', ' + QuotedStr(Edit4.Text) + ', ' + QuotedStr(MaskEdit2.Text) + ', ' + QuotedStr(Edit5.Text) + ', ' + QuotedStr(Edit6.Text) + ', ' + QuotedStr(Edit7.Text) + ', ' + QuotedStr(Edit8.Text) + ', ' + QuotedStr(Edit12.Text) + ', ' + QuotedStr(Edit13.Text) + ', ' + QuotedStr(Edit14.Text) + ')';
Далее только её нужно разбить.
Танюшка

Танюшка (статус: Посетитель), 14 августа 2008, 11:40 [#7]:

да понятно ошибка в том что слишком большой запрос но и ввод новой переменной не помогает ...
Танюшка

Танюшка (статус: Посетитель), 14 августа 2008, 11:44 [#8]:

Не знаю в чем была ошибка когда я в первый раз ввела строковую переменную .... но теперь все работает :))))) Игорь спасибо :)
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 14 августа 2008, 11:48 [#9]:

У Вас ошибка в составлении самого запроса.
Обратите внимание, если Вы в среде Delphi? то символы типа QuotedStr(Edit2.Text) должны быть черного цвета в отличии от строки 'insert into Сотрудники (Табельный_номер,ФИО,Дата_рождения, Классность,Должность,стаж_в_АП,Серия,№_паспорта,Выдан,Дата_выдачи,Страна,Город/область,Улица,Дом,Бригада,образование,УНН)' которая подсвечена синим.
Лучше всего начать с одного поля (чтобы не запутаться).
Вадим К

Вадим К (статус: Академик), 17 августа 2008, 00:50 [#10]:

По поводу квадратных скобок. Это осбенность синтаксиса SQL MS для Access. Если имя поля совпадает с ключевым словом (например date) или содержит "плохие символы" (пробелы), то парсер не может разобрать запрос и выдает ошибку. В многих случаях можно было бы и понять, что там именно имя поля, а не ключевое слово, но вменяемый человек не будет делать такие имена, а дополнительный анализ усложнит разбор запроса. К тому же СУБД должна выполнять запрос, а не размышлять над самим запросом. Правило гласит: "запрос должен интерпретироваться однозначно, иначе он неверный, даже если человек может догадаться как правильно". Именно такие плохие имена полей и беруться в квадратные скобки. В том случае, если программа готовиться к распространению, я настоятельно бы рекомендовал избавиться от русских букв в названии таблиц и полей. Потом будете ругаться на себя и недоумевать, почему у меня работает, у соседа (соседки) тоже, а у заказчика нет.

В других СУБД для таких полей есть свои правила. Например, в MySQL используется обратный апостроф `(он обычно находиться слева от кнопки с цифрой 1 и под Esc. Хотя на некоторых ноутбуках и "суперклавиатурах" слева от пробела.)

Цитата:


предусматривает добавление строки запроса длиною до 256 символов.

Чего-чего??? За такое на жалко и минуса поставить. Такая строка (WideString) теоретически ограничена не менее чем 2^32 - 1. тоесть более 4 миллиардов символов. на практике в 32битных системах больше 2 миллиардов никак не получиться. Но если учитывай остальные факторы, то еще меньше. Но пару миллионов символов - без проблем.
(почему именно 2 гигабайта? - потому что обычно именно сколько памяти доступно для обычного приложения на 32битной системе. на серверных вариантах это может быть 3гига. но надо не забывать, что в этой памяти должна уместиться и сама программа, многие другие данные этой программы. А также стоит не забывать, что для строки надо непрерывная память).

Ноги у числа 255 (да да, именно 255, а не 256) растут с турбопаскаля. Тогда было такое ограничение. Но многие русскоязычные авторы перепечатывают свои книги по турбопаскалю, просто дополнив их описанием компонентов и меняя версию делфи на обложке и рубят деньги. А о том, что string уже давно не 255 они порой и не знают. Печально. А люди заучивают. Но дело поправимое - одна опция компилятору и он будет работать по старинке:)

Но есть другое ограничение, на которое часто натыкаются люди и думают, что это пресловутые 255. Дело в том, что компилятор делфи не переваривает строки кода длинной больше 1024 (именно кода, не важно что там). странное ограничение, хотя писать строки длинее 80 символов некультурно.

Не плодите слухи:)
Галочка "подтверждения прочтения" - вселенское зло.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 18 августа 2008, 14:22 [#11]:

to Вадим К
Спс, в целом согласен, однако я предпочитаю в явном виде задавать тип переменных WideString (нельзя забывать по тип ShortString, используемы в Delphi).
Если не ошибаюсь то директивами компилятора {$H+} и {$H-} устанавливается соответствие между String и либо ShortString, либо AnsiString (по умолчанию).
Вадим К

Вадим К (статус: Академик), 18 августа 2008, 19:57 [#12]:

Да, эти дерективы устанавливают длину строки. Но вот появиться новая делфи, 2009, там будет поддержка юникода. и обычный string будет соответсвовать юникодной строке.
Поэтому надо стараться писать код так, что бы он мало зависел от типа строки. А вот там, где это уже специально нужно (например чтение с файла или сети) задавать ручками.
К тому же стоит помнить, что все существующие типы строк имеют разное поведение, и простая подмена не всегда работает. И как только хочеться сделать что то "специфическое", сразу и вылазит.
Галочка "подтверждения прочтения" - вселенское зло.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:43
Выполнено за 0.02 сек.