Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > запись данных в БД


Автор: Zigmyndshtein 29.5.2008, 20:43
подскажите пожалуйста как мне передать данные с формы в БД
я использую компонент Query, в его свойстве SQL содержится такая строка "select *from <table>", это строка мне нужна для операции с полями базы.
как нме при таком раскладе собрать данные из компонентов Edit на фотме и записать их в базу.
я пробовал 

query->FildByName("имя поля")->Value=Edit->Text;

но ничего не вышло, вывалилась ошибка

Автор: Rodman 29.5.2008, 20:46
используй не SELECT, а INSERT!

Автор: Dmi3ev 29.5.2008, 21:40
не понимаю в чем у Вас проблема? вот так не подходит?
Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO имя_таблицы (поле1, поле2)  VALUES ("+Edit1->Text+" , "+Edit2->Text+");");
Query1->Open();

писал прям тут, но ошибок вроде нет smile 

Автор: Данкинг 29.5.2008, 23:39
Цитата(Dmi3ev @  29.5.2008,  22:40 Найти цитируемый пост)
Query1->Open();

Может, Query1->ExecSql ?

Автор: Zigmyndshtein 29.5.2008, 23:49
Цитата(Dmi3ev @ 29.5.2008,  21:40)
не понимаю в чем у Вас проблема? вот так не подходит?
Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO имя_таблицы (поле1, поле2)  VALUES ("+Edit1->Text+" , "+Edit2->Text+");");
Query1->Open();

писал прям тут, но ошибок вроде нет smile

этот код вешать на кнопку? если так то я уже пробовал этот вариант! ругается... на "плюсы" ругатеся и говорит, что запись не может быть добавлена.
може как то нужно открыть базу или ещё чего?

Автор: Данкинг 29.5.2008, 23:52
Цитата(Zigmyndshtein @  30.5.2008,  00:49 Найти цитируемый пост)
этот код вешать на кнопку? 

На кнопку добавления данных.

Цитата(Zigmyndshtein @  30.5.2008,  00:49 Найти цитируемый пост)
ругается... на "плюсы"

Какие плюсы? Что именно пишет в ошибке?

Цитата(Zigmyndshtein @  30.5.2008,  00:49 Найти цитируемый пост)
може как то нужно открыть базу или ещё чего? 

Открыть - не открыть, но подключиться к ней определённо не мешало бы! smile 

Автор: Zigmyndshtein 29.5.2008, 23:58
Данкинг
база подключна через Query.
а зачем прописывать в самом начале запроса Query->Close();

а ругается на те плюсы которые перед и после Edit-ов стоят

Добавлено через 4 минуты и 56 секунд
я впринципе понимаю что сдесь ничего нет сложного, но может я где-то что-то упустил?

Автор: Данкинг 30.5.2008, 00:09
Цитата(Zigmyndshtein @  30.5.2008,  00:58 Найти цитируемый пост)
база подключна через Query.

А сам Query куда подключён?

Цитата(Zigmyndshtein @  30.5.2008,  00:58 Найти цитируемый пост)
а зачем прописывать в самом начале запроса Query->Close();

Чтобы закрыть запрос, а затем обязательно надо очистить его SQL-данные (что мы и видим в примере).

Цитата(Zigmyndshtein @  30.5.2008,  00:58 Найти цитируемый пост)
а ругается на те плюсы которые перед и после Edit-ов стоят 

Так какая именно ошибка? Попробуй через параметры (в синтаксисе Билдера могу ошибиться):

Код

 Query1->Close()
 Query1->SQL->Clear()
 Query1->SQL->Text="insert into otchet3 values (:par1,:par2)"
 Query1->Parameters->ParamByName("par1")->Value=Edit1->Text
 Query1->Parameters->ParamByName("par2")->Value=Edit2->Text
 Query1->ExecSQL();



Автор: jonie 30.5.2008, 00:27
Цитата

Query1->SQL.Text
там, наверно, везде ->

Автор: Данкинг 30.5.2008, 01:11
Цитата(jonie @ 30.5.2008,  01:27)
Цитата

Query1->SQL.Text
там, наверно, везде ->

Ну понятно, я с Дельфи переделывал. Сейчас исправлю.

Автор: Dmi3ev 30.5.2008, 10:12
Данкинг, на счет execsql ты прав, это же не запрос на выборку smile 
 
Zigmyndshtein, я немного неправильно написал, чтобы работало, надо так:
Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Table1 (Field1, Field2)  VALUES ( '"+Edit1->Text+"', '"+Edit2->Text+"')");
Query1->ExecSQL();

добавились кавычки одинарные перед и после Edit-ов, заметил? это чтобы он понимал, что мы добавляем свой текст, а не имя поля. если будешь добавлять число, то не надо их ставить, и так понятно, что это не имя поля. если бы у нас были числовые поля, а не текстовые, мы бы так написали:
Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Table1 (Field1, Field2)  VALUES ( "+StrToInt(Edit1->Text)+", "+StrToInt(Edit2->Text)+")");
Query1->ExecSQL();

эти примеры я проверил, работают.

Автор: Zigmyndshtein 30.5.2008, 11:35
попробовал я этот код:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Obchii_jyrnal (Num_zajavki)  VALUES ( "+StrToInt(Edit1->Text)+")");
Query1->ExecSQL();

выпала ошибка ещё при компидяции:
[C++ Ioeaea] Unit3.cpp(32): E2085 Invalid pointer addition

со следующим вариантом кода:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Obchii_jyrnal (Num_zajavki, Dataa)  VALUES ( '"+Edit1->Text+"', '"+Edit2->Text+"')");
Query1->ExecSQL();
вроде всё нормально, он красиво комплицца и прога запускается, но при нажатии на кнопку занесения данных в дазу на которой висит код вываливается сообщение:
Prolect Project2.exe raised exception class EDBEngineError with message 'Fild value required.'. Process stoeppd. Use Step or Run to continue

Автор: Dmi3ev 30.5.2008, 12:12
разберитесь с типами полей, из за этого у вас все проблемы.
давайте подробнее:
1. какая бд(paradox, dbase, ... )?
2. имена полей и типы?
3. куда и чего вставить?
а то приходится догадываться, что там у вас.

Автор: TaNK 30.5.2008, 12:17
Цитата(Zigmyndshtein @ 30.5.2008,  11:35)
попробовал я этот код:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Obchii_jyrnal (Num_zajavki)  VALUES ( "+StrToInt(Edit1->Text)+")");
Query1->ExecSQL();

выпала ошибка ещё при компидяции:
[C++ Ioeaea] Unit3.cpp(32): E2085 Invalid pointer addition

со следующим вариантом кода:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Obchii_jyrnal (Num_zajavki, Dataa)  VALUES ( '"+Edit1->Text+"', '"+Edit2->Text+"')");
Query1->ExecSQL();
вроде всё нормально, он красиво комплицца и прога запускается, но при нажатии на кнопку занесения данных в дазу на которой висит код вываливается сообщение:
Prolect Project2.exe raised exception class EDBEngineError with message 'Fild value required.'. Process stoeppd. Use Step or Run to continue

Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Obchii_jyrnal (Num_zajavki)  VALUES ( "+(Edit1->Text)+")");
Query1->ExecSQL();



Dataa - какого типа Date или varchar?

Автор: Zigmyndshtein 30.5.2008, 13:24
Dmi3ev
БД paradox
поле(Num_Zajavriki)  тип Number(N)
поле(Dataa)   тип Date(D)
и есть поле Naimenovanie    тип Alpha(A)

и нужно из Edit-тов на форме собрать данные записать в БД

Автор: Dmi3ev 30.5.2008, 14:17
этот код работает 100 процентов, только что компилировал:
Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO Table2 (F1, F2, F3)  VALUES ( "+Edit1->Text+", '"+Edit2->Text+"', '"+Edit3->Text+"')");
Query1->ExecSQL();

поля
F1-N
F2-A-50
F3-D
вводи число, например 1 в эдит1, строку в эдит2, а дату в формате дд.мм.гггг в эдит3!!!
точно работает)))

Автор: Zigmyndshtein 31.5.2008, 00:21
Dmi3ev
я попробовал этот код в отдельном проекте, он действительно работает, а в моём проекте не хочет,
вываливается сообщение об ошибке:

Prolect Project2.exe raised exception class EDBEngineError with message 'Fild value required.'. Process stopped. Use Step or Run to continue

может ли вываливаться ошибка если запрос на запись данных в БД производится на второй форме, а на перво форме используется таже БД и таже таблица для просмотра

Автор: Dmi3ev 31.5.2008, 14:12
Цитата

может ли вываливаться ошибка если запрос на запись данных в БД производится на второй форме, а на перво форме используется таже БД и таже таблица для просмотра

может, но тогда должно появляться сообщение о том, что таблица занята (хотя у парадокса бываю загоны, проверь),  а здесь мы видим, что ошибка в том, что значение поля обязательно!!! надо просто внимательно посмотреть:
1. сколько значений ты вставляешь и сколько полей (равно ли это число)
2. убрать свойство required у полей
3. типы полей и того, что ты вставляешь
если ничего не получится, выкладывай проект, просто так будет проще и быстрее, кто-нибудь да поможет, а представлять как у Вас там и чего гораздо труднее)))

Автор: Zigmyndshtein 31.5.2008, 17:37
Dmi3ev
нашел в чем была проблемма. я добавлял всего одну запись в базу, а обязательных для заполнения стояло 2 поля!!!
спасибо за помощь!!! smile 
ещё один вопросик мелочный как после закрытия одной формы обновить данные в той фотме которая отбражает содержимое базы (после закрытия формы заполнения форма отображения становится активной)

Автор: Данкинг 31.5.2008, 18:16
Цитата(Zigmyndshtein @  31.5.2008,  18:37 Найти цитируемый пост)
ещё один вопросик мелочный как после закрытия одной формы обновить данные в той фотме которая отбражает содержимое базы (после закрытия формы заполнения форма отображения становится активной) 

В общем и целом - переподключиться к БД.

Автор: Dmi3ev 31.5.2008, 21:47
если там, допустим, данные хранятся в Table, то тогда надо написать:
Код

Table1->Active=false;
Table->Active=true;

ваще есть еще рефреши всякие, но так точно можно)))

Автор: Zigmyndshtein 1.6.2008, 10:48
Dmi3ev,  у мня правдо вместо тайбл используется query, ну а куда новесить лучше эту процедуру, если по закрытию одной формы должна обновиться вторая

Автор: Данкинг 1.6.2008, 10:59
Цитата(Zigmyndshtein @  1.6.2008,  11:48 Найти цитируемый пост)
у мня правдо вместо тайбл используется query

Тогда заново выбрать данные в запрос... smile 

Автор: Xolodna 2.6.2008, 14:16
Ребят, у меня практически такая же проблема. При попытке добавления новой записи в таблицу, билдер выдает ошибку "Ошибка синтаксиса в инструкции INSERT INTO". Перепробовала уже всё, что знала - никак не хочет добавлять:( Может, вы хоть чем поможете. Вот код:

   AnsiString id_opr = DBEdit1->Text;
   AnsiString id_answ = DBLookupComboBox4->KeyValue;
   AnsiString date = MaskEdit1->Text;

   ADOQuery2->Close();
   ADOQuery2->SQL->Clear();
   ADOQuery2->SQL->Add("INSERT INTO Rezults (id_opr, id_answ, date) VALUES ('"+id_opr+"','"+id_answ+"','"+date+"');");
   ADOQuery2->ExecSQL();

Автор: gather 2.6.2008, 14:25
Запрос, который пытается выполнить - в студию (точнее сказать сюда) давайте

Автор: Xolodna 2.6.2008, 15:07
Эээм... да я вроде как его написала в сообщении....

Автор: Rififi 2.6.2008, 15:12
Цитата(Xolodna @  2.6.2008,  14:16 Найти цитируемый пост)
При попытке добавления новой записи в таблицу, билдер выдает ошибку

ошибка, я уверен, в неправильном формате даты (переменная date)
чтобы её избежать, для этого придумали параметры команды. в гугле полно примеров, юзай поиск.

Автор: Xolodna 2.6.2008, 15:28
Цитата

ошибка, я уверен, в неправильном формате даты (переменная date)
чтобы её избежать, для этого придумали параметры команды. в гугле полно примеров, юзай поиск.


Поюзаю, конечно, на всякий случай, но дело в том, что один запрос на добавление подобного вида уже есть, и он работает, и не ругается ни на что. Там такая же дата, такого же формата. Поэтому я, мягко говоря, в недоумении:(

Автор: gather 2.6.2008, 15:33
Цитата(Xolodna @  2.6.2008,  15:07 Найти цитируемый пост)
Эээм... да я вроде как его написала в сообщении.... 

вместе с реальными данными, которые Вы добавляете.
Выведите запрос например в memo и copypaste сюда.

Автор: Xolodna 2.6.2008, 16:08
Всем огромное спасибо! Ошибку нашла и она действительно была связана с полем даты, как и сказал Rififi. 
Вот исправленная строка:

ADOQuery2->SQL->Add("INSERT INTO Rezults (id_opr, id_answ, [date]) VALUES ("+id_opr+","+id_answ+",'"+date+"');");

Просто не хватало скобочек квадратныхsmile

Автор: Zigmyndshtein 3.6.2008, 16:45
спасибо огромное всем за помощь

Автор: blackDancer 12.2.2009, 19:48
Цитата(Zigmyndshtein @ 30.5.2008,  13:24)
Dmi3ev
БД paradox
поле(Num_Zajavriki)  тип Number(N)
поле(Dataa)   тип Date(D)
и есть поле Naimenovanie    тип Alpha(A)

и нужно из Edit-тов на форме собрать данные записать в БД

Посмотри здесь 
http://forum.vingrad.ru/forum/topic-245869/anchor-entry1775201/0.html
в самом конце темы может то?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)