Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/89: Рейтинг темы: голосов - 89, средняя оценка - 4.67
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
1

Добавление записи в таблицу

26.09.2010, 19:20. Показов 17030. Ответов 24
Метки нет (Все метки)

ВСем привет!
Ребят, помогите плиз. Я уже не знаю как быть. Пытаюсь создать на кнопочку обычное добавление записи в таблицу, но нифига не выходит.

C++
1
2
3
4
5
6
7
8
void __fastcall TForm2::Button6Click(TObject *Sender){
   ADOQuery1->Close();
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add("INSERT INTO Клиент (ИдентификаторКлиента, ФИО, СписокКассет, ДатаВыдачиКассеты)");
   ADOQuery1->SQL->Add("VALUES (Form2->DBEdit2->Text, DBEdit1->Text, DBEdit3->Text, DBEdit4->Text)");
   ADOQuery1->Open();
   DBGrid1->DataSource=DataSource2;
}
На это выскакивает ерор:
0
Миниатюры
Добавление записи в таблицу  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2010, 19:20
Ответы с готовыми решениями:

Добавление записи в 2 таблицу
Всем привет. Ребят помогите пожалуйста в c++ Builder не давно начал работать да и в c++ не особо...

Добавление записи в таблицу Access
Пытаюсь добавить запись в таблицу Клиент Form4->ADOQuery4->Close();...

Добавление записи в таблицу через ADOQuery
Здравствуйте) В моей программе таблица базы данных подключена к компоненту ADOQuery, насколько я...

Добавление записи в таблицу через Edit
Всем привет. Знаю, что подобная тема не однократно рассматривалась, но пожалуйста помогите мне. У...

24
1 / 1 / 0
Регистрация: 06.07.2010
Сообщений: 147
26.09.2010, 21:12 2
The_Immortal, попробуйте
C++
1
 ADOQuery1->SQL->Add("VALUES ("+Form2->DBEdit2->Text+", "+DBEdit1->Text+", "+DBEdit3->Text+","+DBEdit4->Text+")");
И названия форм перед эдитами добавьте.
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.09.2010, 22:08  [ТС] 3
Цитата Сообщение от OGur4ik Посмотреть сообщение
The_Immortal, попробуйте
ADOQuery1->SQL->Add("VALUES ("+Form2->DBEdit2->Text+", "+DBEdit1->Text+", "+DBEdit3->Text+","+DBEdit4->Text+")");
И названия форм перед эдитами добавьте.
"Ошибка синтаксиса (пропущен оператор) в выражении запроса Form2->DBEdit2->Text"
И что странно, уже вмесьл DBEdit поставил просто Edit, а в ошибке все равно пишется DBEdit, хотя ребилд делал и перезапускал проект... =/
0
Супер-модератор
8765 / 2498 / 142
Регистрация: 07.03.2007
Сообщений: 11,849
26.09.2010, 22:22 4
The_Immortal, покажите, что там у вас за код? а еще попробуйте удалить объектники и tds и билд сделать снова...
0
1 / 1 / 0
Регистрация: 06.07.2010
Сообщений: 147
26.09.2010, 22:52 5
И ехешник удалите перед тем, как билд сделать... Бывает такой глюк.
А кавычки с плюсиками, мне кажется, надо-таки поставить...
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.09.2010, 23:26  [ТС] 6
Код:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm2::Button5Click(TObject *Sender){
   ADOQuery1->Close();
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add("INSERT INTO Клиент (ИдентификаторКлиента, ФИО, СписокКассет, ДатаВыдачиКассеты)");
   ADOQuery1->SQL->Add("VALUES ("+Form2->Edit1->Text+", "+Form2->Edit2->Text+", "+Form2->Edit3->Text+","+Form2->Edit4->Text+")");
   ADOQuery1->Open();
   DBGrid1->DataSource=DataSource2;
}
При заполнении Editов (1, Иванов Петр Андреевич, 25, 12.09.2010):
"Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Иванов Петр Андреевич'"
0
1 / 1 / 0
Регистрация: 06.07.2010
Сообщений: 147
26.09.2010, 23:34 7
The_Immortal, а в какой именно момент эта ошибка вылезает?
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
26.09.2010, 23:37  [ТС] 8
Ошибка появляется при нажатии на Button5.
0
25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81
27.09.2010, 08:33 9
тут вроде просто пропущены апострофы для текстовых полей, т.е. должно быть 'Иванов Петр Андреевич', а не Иванов Петр Андреевич
0
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
27.09.2010, 08:51 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm2::Button6Click(TObject *Sender){
   ADOQuery1->Close();
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add("INSERT INTO Клиент (ИдентификаторКлиента, ФИО, СписокКассет, ДатаВыдачиКассеты)");
   ADOQuery1->SQL->Add("VALUES (:Param1, :Param2, :Param3, :Param4)");
   ADOQuery1->Parameters->ParamByName("Param1")->Value = ...;
   ADOQuery1->Parameters->ParamByName("Param2")->Value = ...;
   ADOQuery1->Parameters->ParamByName("Param3")->Value = ...;
   ADOQuery1->Parameters->ParamByName("Param4")->Value = ...;
   ADOQuery1->ExecSQL();
   DBGrid1->DataSource=DataSource2;
}
и вообще запросы которые не возвращают никакого набора данных а в твоем случае так и есть не надо делать ADOQuery1->Open(); надо ADOQuery1->ExecSQL();
0
Супер-модератор
8765 / 2498 / 142
Регистрация: 07.03.2007
Сообщений: 11,849
27.09.2010, 10:18 11
The_Immortal, текстовые поля и даты предполагают обрамление одинарными кавычками (в большинстве sql-серверов, окромя деффективного аксесса... там даты диезами обрамляются)
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
27.09.2010, 18:20  [ТС] 12
Большое спасибо за помощь =)
запись в таблицу добавляется, но появилась другая проблема: обновить таблицу в приложении, т.е. увидеть вновь добавленную запись не получается =(
Код выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
      ADOQuery1->Close();
      ADOQuery1->SQL->Clear();
      ADOQuery1->SQL->Add("INSERT INTO Клиент (ИдентификаторКлиента, ФИО, СписокКассет, ДатаВыдачиКассеты)");
      ADOQuery1->SQL->Add("VALUES (:Param1, :Param2, :Param3, :Param4)");
      ADOQuery1->Parameters->ParamByName("Param1")->Value = Form2->Edit1->Text;
      ADOQuery1->Parameters->ParamByName("Param2")->Value = Form2->Edit2->Text;
      ADOQuery1->Parameters->ParamByName("Param3")->Value = Form2->Edit3->Text;
      ADOQuery1->Parameters->ParamByName("Param4")->Value = Form2->Edit4->Text;
      ADOQuery1->ExecSQL();
      DBGrid1->DataSource=DataSource2;
1
Супер-модератор
8765 / 2498 / 142
Регистрация: 07.03.2007
Сообщений: 11,849
27.09.2010, 21:27 13
The_Immortal, посмотрите по форуму, тут такую проблему уже рассматривали...
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
28.09.2010, 23:09  [ТС] 14
Ребят, кто может подсказать мне как возвратить id выбранной строки?
Удаление произвожу следующим образом:
C++
1
2
3
4
5
6
7
String del=Form1->DBGrid1->SelectedField->AsString;
String fielld=Form1->DBGrid1->SelectedField->FieldName;
String sql="DELETE from BD WHERE "+fielld+"="+del+"";
Form1->ADOQuery1->Close();
Form1->ADOQuery1->SQL->Clear();
Form1->ADOQuery1->SQL->Add(sql);
Form1->ADOQuery1->ExecSQL();
То есть, выбираю какую-то ячейку в таблице. Получаю имя столбца, где эта ячейка находится, и само значение ячейки, ну и удаляю... Разумеется, что удалятся все строчки, где будет найдена такое значение, а это бредово... Надо как-то обращаться к ключу... Но вот как - додуматься не могу. В общем, надо как-то обратиться к ключу выделенной строки.

P.S. На самой таблице id не выводится - иначе бы трабла была легко решаема.
0
Супер-модератор
8765 / 2498 / 142
Регистрация: 07.03.2007
Сообщений: 11,849
28.09.2010, 23:19 15
The_Immortal, и в чем сложность... в выборке для дбгрида выбирай ключ, просто его колонку скрой
0
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.09.2010, 09:09  [ТС] 16
"P.S. На самой таблице id не выводится - иначе бы трабла была легко решаема." - тут я, кстати, поторопился...

Lord_Voodoo, что-то я не догоняю =( У меня в дбгриде колнка id не выводится. Даже бы если она выводилась, то как выбирать ключ, когда у меня юзер может выбрать любую ячейку в таблице? Или принудительно заставлять его выбирать ячейку только из первого стоблца (id), если он хочет чет снести?) Ну типа сделать свойство для дбгрида Options-dgRowSelected=True, и теперь будет выбираться целая строчка автоматом и при String del=Form1->DBGrid1->SelectedField->AsString;
будет возвращаться всегда значение первого столбика, т.е. id.
Так что ли?))
0
Супер-модератор
8765 / 2498 / 142
Регистрация: 07.03.2007
Сообщений: 11,849
29.09.2010, 09:15 17
The_Immortal, FieldByName вообще-то вам нужен у источника данных дбгирда... в общем, имя объекта, который прописан в DataSource в свойстве DataSet
1
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.09.2010, 11:12  [ТС] 18
Lord_Voodoo, в свойстве DataSet у DataSource1 у меня всегда сидит ADOQuery1.
А что за FieldByName и как его юзать? Мне по нему хелп вообще ниче не рассказал, ровно также как и гугл =(

Добавлено через 1 час 4 минуты
Lord_Voodoo, вроде бы понял, что вы имели в виду, но у меня как всегда ниче не работает =(
Вот так все ок:
C++
1
2
3
4
5
6
7
int del=Form1->DBGrid1->SelectedField->AsInteger;
String f=Form1->DBGrid1->SelectedField->FieldName;
String sql="DELETE from BD WHERE "+f+"="+del+"";
Form1->ADOQuery1->Close();
Form1->ADOQuery1->SQL->Clear();
Form1->ADOQuery1->SQL->Add(sql);
Form1->ADOQuery1->ExecSQL();
А вот как вы предложили:
C++
1
2
3
4
5
6
int del=Form1->ADOQuery1->FieldByName("id")->AsInteger;
String sql="DELETE from BD WHERE [id]="+del+"";
Form1->ADOQuery1->Close();
Form1->ADOQuery1->SQL->Clear();
Form1->ADOQuery1->SQL->Add(sql);
Form1->ADOQuery1->ExecSQL();
Ругается на String sql="DELETE from BD WHERE [id]="+del+""; - E2085 Invalid pointer addition

А, ну я диблойд =) Пытаюсь в стринг запихнуть чар.. В общем надо так String del=Form1->ADOQuery1->FieldByName("id")->AsString; - интресно будет ли это чем-нибудь чревато? Ну что id у меня строковый... Надеюсь, что нет =)
Ребят, а теперь может кто-нибудь, пожалуйста, поделиться секретом, как сделать статичную ширину столбцов в дбгриде предварительно? Вроде бы выстраиваешь ее, а при запуске там ппцвсе растягивается ужас прям... Только не говорите, что это программно надо прописывать)) Если так, то это ж ппц - после каждой процедуры...

Добавлено через 15 минут
Стоп, а почему у меня тогда тут работает? =)
C++
1
2
3
int del=Form1->DBGrid1->SelectedField->AsInteger;
String f=Form1->DBGrid1->SelectedField->FieldName;
String sql="DELETE from BD WHERE "+f+"="+del+"";
А тут нет:
C++
1
2
int del=Form1->ADOQuery1->FieldByName("id")->AsInteger;
String sql="DELETE from BD WHERE [id]="+del+"";
Так что мой вывод "А, ну я диблойд =) Пытаюсь в стринг запихнуть инт.." не катит...

Lord_Voodoo, объясните плиз в чем тут дело?
0
25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81
29.09.2010, 14:50 19
в Вашем случае, я бы порекомендовал на форму Form1 добавить ещё один компонент TADOQuery и назвать его, допустим, ComQuery для выполнения в нём sql запросов, например на удаление, в качестве настроек прописать в нём только подключение к базе. А при вызове нужной процедуры, например удаления, использовать именно ComQuery, а не тот TADOQuery, в котором вы отображаете данные, просто чтоб не запутаться)
C++
1
2
3
4
5
6
7
8
AnsiString sqlString;
sqlString = AnsiString("delete from BD where id=") + IntToStr(Form1->ADOQuery1->FieldByName("id")->AsInteger);
Form1->ComQuery->Close();
Form1->ComQuery->SQL->Clear();
Form1->ComQuery->SQL->Add(sql);
Form1->ComQuery->ExecSQL();
Form1->ADOQuery1->Close();
Form1->ADOQuery1->Open();//обновили содержимое грида
код же простой, не понятно в чём трудности
1
1566 / 502 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.09.2010, 16:25  [ТС] 20
neoMitya, да, вариантов существует множество, я же просто хотел разобраться что не так в моем случае. Ну да пофиг, работает и ладно.

Возникла новая проблема... У меня идет запись в таблицу посредством стандартного запроса Insert into, но перед этим мне надо проверить а нет ли уже записи с таким значением по определенному полю. Зашел в тупик... Делаем выборку, к примеру: SELECT login FROM users WHERE login=Edit1->Text , а что дальше? Как вернуть через SQL-запрос значение, если таковое было найдено ? Ну не само значение, а уведомление о том что, что-то было найдено по такому запросу.

Добавлено через 25 минут
Ыть! Разобрался =) Ребят, а не поможете с "может кто-нибудь, пожалуйста, поделиться секретом, как сделать статичную ширину столбцов в дбгриде предварительно? Вроде бы выстраиваешь ее, а при запуске там ппцвсе растягивается ужас прям... Только не говорите, что это программно надо прописывать)) Если так, то это ж ппц - после каждой процедуры..."
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2010, 16:25

Как при вставке в таблицу записи получить значение автоинкремента для подстановки в другую таблицу?
Имеются 2 таблицы. Например header и document. Header cd_header (автоинкрементное поле) dt...

Добавление новой записи в таблицу и осуществление запроса на добавление при загрузке формы
Здравствуйте. Есть одна просьба, подскажите как сделать или пример кода покажите на вот такую...

Автоматическое добавление записи в таблицу, после добавления записи в другой таблице
Привет всем! Подскажите, как Access 2010 сделать так, чтобы при добавлении записи в одной таблице,...

Добавление записи в таблицу на основе существующей записи
Здравствуйте! PHP и MySQL только начинаю изучать и естественно не все получается. У меня есть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.