|
Вопрос # 1 814/ вопрос открыт / |
|
Здравствуйте, эксперты!
Пытаюсь добавить новую запись в БД с помощью sql запроса ... но возникает ошибка : "Ошибка синтексиса в инструкции INSERT INTO"
 |
Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 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 (статус: Студент), 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]:
да понятно ошибка в том что слишком большой запрос но и ввод новой переменной не помогает ...
|
|
Шичко Игорь (статус: 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 будет соответсвовать юникодной строке.
Поэтому надо стараться писать код так, что бы он мало зависел от типа строки. А вот там, где это уже специально нужно (например чтение с файла или сети) задавать ручками.
К тому же стоит помнить, что все существующие типы строк имеют разное поведение, и простая подмена не всегда работает. И как только хочеться сделать что то "специфическое", сразу и вылазит.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|