Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321

Параметры в запросах АДО

10.08.2016, 09:45. Показов 6274. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На счет параметров в АДО. Чтобы использовать параметры надо из прописать в запросе insert() values(a,ss,d,fg,g,g). Правильно? но выскакивает ошибка что параметр не найден. Хотя эти имена параметров не юзал раньше. а прописывая в свойствах запроса, он так же выдает ошибку о неверном параметре. Как выкрутится?
Delphi
1
2
3
4
5
6
7
8
9
DataModule1.QOther.Close;
  DataModule1.QOther.SQL.Clear;
  DataModule1.QOther.SQL.Add('insert into dogovors (number,date_start,date_end,opisanie,names) values(q11,q21,q31,q41,q51)');
  DataModule1.QOther.Parameters.ParamByName('q11').Value:=edit1.text;
  DataModule1.QOther.Parameters.ParamByName('q21').Value:=DateTimePicker1.Date;
  DataModule1.QOther.Parameters.ParamByName('q31').Value:=DateTimePicker2.Date;
  DataModule1.QOther.Parameters.ParamByName('q41').Value:=edit3.text;
  DataModule1.QOther.Parameters.ParamByName('q51').Value:=edit2.text;
  DataModule1.QOther.ExecSQL;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2016, 09:45
Ответы с готовыми решениями:

Как правильно работать с АДО ?
Есть локальная база Access. При добавлении новых записей через один Recordset приходится долго ждать пока они появятся в другом Recordset,...

Объединяющий запрос в адо.нет
daWorkers.InsertCommand = new SqlCommand("Insert Trade(point,firstName,lastName,cash,_date,salary)"+ ...

Доступ к данным с через АДО
Создать экранную форму с тремя переключателями, заказы, поставщики, товары(которые соответствуют таблицам базы данных Борей) Написать...

37
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.08.2016, 23:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Жалуется на поле number. выделяет и ошибку пишет в аксессе
Собственно, поле number, значит - числовое. A значение параметра по этому полю, как текст присваивается:
Delphi
1
DataModule1.QOther.Parameters.ParamByName('q11').Value := edit1.text;
Надо в виде числа записывать.
Если целое:
Delphi
1
DataModule1.QOther.Parameters.ParamByName('q11').Value := StrToInt(edit1.text);
Если вещественное:
Delphi
1
DataModule1.QOther.Parameters.ParamByName('q11').Value := StrToFloat(edit1.text);
Добавлено через 4 минуты
В таблице dogovors есть ещё поле ID. Если оно объявлено, как полноценный идентификатор, то надо ещё решить вопрос с созданием по нему уникального значения при вставке записи.

Добавлено через 47 секунд
Надо или настроить его в БД на генерацию уникального значения или генерировать такое значение в программе.
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
10.08.2016, 23:06  [ТС]
а есть какая то принципиальная разница между sql.add('') и sql.text:=''

И поле number у меня строковое, так как номер договора бывает с буквами и точками

Добавлено через 1 минуту
в акцессе автосчетчик стоит и есть связи между ключами внешними и уникальными( id и id_acc) например
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
10.08.2016, 23:06
Самое смешное, что ему действительно не нравится поле с именем number. Возьмите его в скобки [number]
1
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.08.2016, 23:14
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
а есть какая то принципиальная разница между sql.add('') и sql.text:=''
SQL.Text - надёжнее. Были сообщения, что при использовании SQL.Add() возникали баги - из-за неявных вызовов Prepare после каждого SQL.ADD().
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
И поле number у меня строковое
Ясно, тогда надо оставить присваивание в виде строкового значения.

Добавлено через 3 минуты
Цитата Сообщение от Скандербег Посмотреть сообщение
Скобки для наименований полей и таблицы - будет работать:
Цитата Сообщение от Пытливый Посмотреть сообщение
Возьмите его в скобки [number]
Да, вы правы - в скобки надо заключить. Ведь Number - это зарезервированное слово в БД - идентификатор типа данных. А в таблице оно в качестве имени поля используется.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
10.08.2016, 23:23
Цитата Сообщение от Mawrat Посмотреть сообщение
SQL.Text - надёжнее.
Дело не только в надежности, но и в том, что метод Add добавляет в список новую строку, а присвоение строки свойству Text заменяет всё что есть в списке на новое значение, т.е. очищать ничего не надо как это делается при использовании Add.
Разница между ними все же есть, но учитывается в определенных ситуациях.
Во многих случаях Text удобнее, но и Add тоже используется.
Например, при сложных многострочных запросах, когда по ходу дела нужно менять только одну-две строки.
1
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
11.08.2016, 01:38
Цитата Сообщение от Mawrat Посмотреть сообщение
SQL.Text - надёжнее. Были сообщения, что при использовании SQL.Add() возникали баги
Не верю.
Единственно чему верю, так это сообщение от Пытливый #23.
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
11.08.2016, 08:03  [ТС]
Самое забавное, что теперь в акцессе с текстом проходит запрос, а в делфи с параметрами нет. Сменил имя пол я на namber. В делфи ошибка таже саамя
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
11.08.2016, 08:08
Цитата Сообщение от northener Посмотреть сообщение
Не верю.
Я пересказал, что слышал (читал в сообщениях). Вернее, писалось так - что баги возникали, когда использовался ADO и запрос формировался из нескольких вызовов SQL.Add(). Т. е., по этому вопросу я не проводил самостоятельных исследований и представление сформировал на основе мнений других людей.
Выше Скандербег написал разъяснения на этот счёт. У него большой опыт разработки БД. В общем, как я понял, SQL.Add() "бояться" не надо.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
11.08.2016, 08:42
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Сменил имя пол я на namber. В делфи ошибка таже саамя
Вчера было так:
Проект взял. Ошибка. Та самая. Наименование поля number изменил на numdog.
Ошибки в Аксессе не было, но в Дельфи "Ошибка синтаксиса в инструкции INSERT INTO".
После того как все наименования (и полей и таблицы) были заключены в квадратные скобки - ошибка исчезла и вставка строки в таблицу БД происходила нормально. В посте #20 показан текст, который не давал ошибок.
Для эксперимента наименование number было возвращено (при наличии скобок вокруг всех наименований) - ошибка не вернулась.

Добавлено через 6 минут
Владислав-2012, надо попробовать этот вот текст, который не дает ошибок:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm9.Button1Click(Sender: TObject);
begin
  DataModule1.QOther.SQL.Text :=
       'insert into [dogovors] ([number],[date_start],[date_end],[opisanie],[names]) '+
               'values(:q11,:q21,:q31,:q41,:q51)';
 
  DataModule1.QOther.Parameters.ParamByName('q11').Value:=edit1.text;
  DataModule1.QOther.Parameters.ParamByName('q21').Value:=DateOf(DateTimePicker1.Date);
  DataModule1.QOther.Parameters.ParamByName('q31').Value:=DateOf(DateTimePicker2.Date);
  DataModule1.QOther.Parameters.ParamByName('q41').Value:=edit3.text;
  DataModule1.QOther.Parameters.ParamByName('q51').Value:=edit2.text;
  DataModule1.QOther.ExecSQL;
 
  DataModule1.QOther.Close;
  DataModule1.QOther.SQL.Clear;
  DataModule1.QOther.SQL.Add('select * from dogovors where number = :num');
  DataModule1.QOther.Parameters.ParamByName('num').Value:=edit1.text;
  DataModule1.QOther.open;
  numb:=  DataModule1.QOther.FieldByName('id').aSInteger;
  Form8.Edit1.text:=inttostr(numb);
  Form9.Close;
  Form8.show;
end;
Функция DateOf объявлена в модуле DateUtils.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
11.08.2016, 10:01
Цитата Сообщение от Скандербег Посмотреть сообщение
Владислав-2012, надо попробовать этот вот текст, который не дает ошибок:
Я сейчас испытал этот вариант - без ошибок отрабатывает. Причём, если не обрамить скобками имя таблицы - dogovors - то возникает ошибка синтаксиса SQL. Т. е., имя таблицы обязательно надо в скобках задать и поле number - тоже.
0
11.08.2016, 10:07

Не по теме:

Цитата Сообщение от Mawrat Посмотреть сообщение
Причём, если не обрамить скобками имя таблицы - dogovors - то возникает ошибка синтаксиса SQL.
Вот уж это совсем непонятно. Всю жизнь писал без скобок - никогда проблем не было.

0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
11.08.2016, 10:19
Цитата Сообщение от northener Посмотреть сообщение
Вот уж это совсем непонятно. Всю жизнь писал без скобок - никогда проблем не было.
Сейчас ещё поэкспериментировал. Оказалось следующее. В скобки обязательно надо заключить имена двух полей: number и names:
Delphi
1
2
3
  DataModule1.QOther.SQL.Text :=
    'insert into dogovors ([number],date_start,date_end,opisanie,[names])'
    + #32'values(:q11,:q21,:q31,:q41,:q51)';
Тогда отрабатывает без ошибок. Ну, а для надёжности, лучше уж все имена в скобки заключать, тогда.
0
12.08.2016, 00:32

Не по теме:

Цитата Сообщение от Mawrat Посмотреть сообщение
Сейчас ещё поэкспериментировал. Оказалось следующее. В скобки обязательно надо заключить имена двух полей: number и names
Тоже какое-то шаманство, имхо. Ну ладно number. Это действительно зарезервированное слово. Но names?
А ты не пробовал как я предлагал в #9 принудительно задавать тип параметра перед присвоением ему значения, дабы облегчить жизнь этому недоделанному Акцессу?

0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
12.08.2016, 09:03  [ТС]
На счет зарезервированных слов я понял, просто не все их знаю.

Delphi
1
2
3
4
5
6
7
8
  DataModule1.QOther.close;
  DataModule1.QOther.sql.Add('insert into [clients] ([date_zvon],[date_next],[comment],[id_stadia],[id_dogovor]) values(:z1,:z2,:z3,:z4,:z5)');
  DataModule1.QOther.Parameters.ParamByName('z1').Value:=FormatDateTime('dd.mm.yyyy',DateTimePicker1.Date);
  DataModule1.QOther.Parameters.ParamByName('z2').Value:=FormatDateTime('dd.mm.yyyy',DateTimePicker2.Date);
  DataModule1.QOther.Parameters.ParamByName('z3').Value:=edit4.text;
  DataModule1.QOther.Parameters.ParamByName('z4').Value:=STady;
  DataModule1.QOther.Parameters.ParamByName('z5').Value:=Form9.numb;
  DataModule1.QOther.ExecSQL;
Но вот тут со скобками и синтаксис правилен. В акцессе все проходит. а ошибку вызывает как на скине
Миниатюры
Параметры в запросах АДО  
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
12.08.2016, 09:04  [ТС]
Но тупо поменял с sql.add на sql.text и запрос проходит нормально, ну по крайнейна первый взгляд...
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.08.2016, 09:23
Проходит потому что в случае Add список строк запроса был не пустой, а Clear не было - при добавлении новой строки остатки, которые в тексте были и гадили.
В случае Text все что было в списке затирается передаваемой строкой.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
12.08.2016, 09:27
Цитата Сообщение от northener Посмотреть сообщение
Тоже какое-то шаманство, имхо. Ну ладно number. Это действительно зарезервированное слово. Но names?
Сейчас посмотрел. Оказалось, NAMES присутствует в списке зарезервированных слов в спецификации движка Microsoft Jet 4.0:
List of Microsoft Jet 4.0 reserved words.
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
12.08.2016, 14:16  [ТС]
Спасибо, разберемся)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2016, 14:16
Помогаю со студенческими работами здесь

Тормоза при переходе с бде на адо
Проблемма такая....... Есть некий построитель отчетов написанный на делфях, который работает с бд парадоксом, потребывалось перейти на...

Проблема с драйвером АДО: driver not correctly installed
привет всем! У меня возникла проблема с драйвером адо говорит что-то типа этого: driver not correctly installed и как установить...

Нужен ли Оракл-клиент для АДО базы?
Привет ребята и девчонки! Пишу я ему (VBA), считай мне что-то там из базы через АДО, а он мне и говорит Оракл-клиента мол у тебя нету! ...

Делаю клиент-сервер, конект к БД через адо.
Не работает кирилица когда беру данные с сервера.. команды: ASCIIEncoding str = new ASCIIEncoding(); ...

Как подключить к моему проекту в VB.NET библиотеку АДО?
Только сегодня приступил к изучению VB.NET, раньше плотно работал с VBA и такие штуки мне непонятны. Просто не работает конструкция,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru