Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.03;
Скачать: CL | DM;

Вниз

Вставка записи в бд   Найти похожие ветки 

 
Staraya   (2003-03-16 21:42) [0]

Здравствуйте! Я совсем недавно начала изучать программирование бд клиент-сервер. Мне нужно вставить запись в таблицу. На форме располагаются компоненты DataSourse1, dataBase1,query1,edit1,edit2 и кнопочка "Записать".Для того чтоб вставить запись я должна написать в свойстве sql компонента query1 "insert into Имя_Табл...values(список знач)". Я одного не пойму, зачем такие сложности, обычный юзер не знает язык sql, он должен их вводить в поля edit1,edit2. А как это реализовать я не могу разобраться. Может кому-то этот вопрос покажется не достойным внимания, но очень прошу помочь.


 
Sergey Masloff   (2003-03-16 22:31) [1]

Посмотрите примеры из поставки Delphi (каталог Demos/Db)


 
Anatoly Podgoretsky ©   (2003-03-16 23:13) [2]

Зачем, это ты напиши в программе, а в edit1, edit2 только данные для вставки.


 
alex55 ©   (2003-03-16 23:46) [3]

Начни с того, что вместо TQuery используй TTable, а вместо TEdit - TDBEdit. А кнопочкой "Записать"
выполни TTable.Post. Если очень хочется использовать TQuery - позаботься, чтоб он был "живым"
(TQuery.RequestLive). А конечному user"у не то чтобы не надо знать SQL, но и о его существовании
он может не подозревать.


 
HSolo ©   (2003-03-17 10:28) [4]

А вот этого:
"вместо TQuery используй TTable"
делать не надо


 
Desdechado ©   (2003-03-17 10:35) [5]

1. TTable и SQL-сервер - мертворожденное дитя :)
2. ТQuery не обязательно живой должен быть, можно и CachedUpdates использовать
3. команду INSERT INTO можно формировать прямо в коде, подставляя параметры в нее из Edit"ов


 
msguns ©   (2003-03-17 12:22) [6]

>Desdechado © (17.03.03 10:35)

Я вот тоже разбираюсь с этой фигней (вставкой/изменением) и хочу делать это через TIBDataSet (InsertSQL, UpdateSQL и т.д.). Формирую эти запросы ручками, а потом Insert и Post, а после этого еще и Locate, чтоб стала активной. Так вот как мне использовать параметры в этих запросах, я так и не разобрался (Params ведь для Select ?). Во всех книгах, что у меня есть, приводятся примеры либо с BDE - компонентами (Тексейра), либо через TIBSQL/TIBQuery (Самплы Борланда + Фаронов), либо FIBPlas (Ковязин).
Если не трудно, объясните дуракам поподробнее именно с TIBDataSet (мне он интуитивно кажется самым интересным)


 
Johnmen ©   (2003-03-17 12:33) [7]

> ms guns ©

Серёга, ты чего измельчал то ? :)))

По вопросу :
Значения параметров берутся автоматически из значений соответствующих полей записи НД.
Напр. :tratata - подставляется значение поля tratata
Также из полей записи НД, на который м.б.установлен DataSource
Также можно руками прописать значение параметра...


 
zacho ©   (2003-03-17 12:34) [8]

Примеры для FIBPlus отлично подойдут и для IBX, и то, и другое, родилось из FIBC. Естественно, те примеры, где не используются спецефические возможности FIB+
Параметры можно использовать не только в SelectSQL, но и в InsertSQL, ModifySQL, DeleteSQL, RefreshSQL.
Вот простой пример:
Предположим, есть таблица MYTABLE с полями ID - первичный ключ и NAME varchar. SelectSQL выглядит так: SELECT ID,NAME FROM MYTABLE
Тогда:
DeleteSQL: DELETE FROM MYTABLE WHERE ID=?ID
ModifySQL: UPDATE MYTABLE SET NAME=?NAME WHERE ID=?ID
InsertSQL: INSERT INTO MYTABLE (ID,NAME) VALUES(?ID,?NAME)
Если ID может изменяться, то ModifySQL толжен быть таким UPDATE MYTABLE SET ID=?ID, NAME=?NAME WHERE ID=?OLD_ID


 
Anatoly Podgoretsky ©   (2003-03-17 12:36) [9]

alex55 © (16.03.03 23:46)
Лучше выдумать не мог "вместо TQuery используй TTable"

С какой стати ты приплел сюда "чтоб он был "живым" это для INSERT INTO то

"А конечному user"у не то чтобы не надо знать SQL" пользователю конечно ни к чему, а вот тебе не помешает.




 
MsGuns ©   (2003-03-17 13:06) [10]

>Johnmen © (17.03.03 12:33)
>Серёга, ты чего измельчал то ? :)))

Это не я измельчал - задрал наш Proxi, уже обещал мордель шефу этой гнилой конторы начистить, ведро водяры проставить, жену его ... во всех позициях - ничего не помогает - инет как был хреновый, так и остается. По 7 раз надо набирать чтоб хоть что-то отправить,- нетрудно и ник свой не так набрать.



 
MsGuns ©   (2003-03-17 13:09) [11]

>zacho © (17.03.03 12:34)

Спасибо за столь подробный ответ. Но вот еще: разница между ":" и "?". В литературе есть и так, и так. Насколько я понял, вообще-то стандарт - это ":", а вопрос - это "мулька" IB ? Так что надо писать - без разницы для IB ?


 
zacho ©   (2003-03-17 13:15) [12]


> MsGuns © (17.03.03 13:09)

Насколько знаю, без разницы.


 
Johnmen ©   (2003-03-17 13:16) [13]

? обозначение параметра в FIBPlus, но можно и :
Для IBX :


 
MsGuns ©   (2003-03-17 13:22) [14]

>zacho © (17.03.03 13:15)
>Johnmen © (17.03.03 13:16)

Спасиба, пачаны, счас спробую ;))

PS Жень, я тебя вообще-то уже записал в свои учителя ;)) Ты не очень возражаешь ?
PPS (хотя кто тебя будет спрашивать ;)))))




 
zacho ©   (2003-03-17 13:22) [15]


> Johnmen © (17.03.03 13:16)

В IBX работает как :, так и ?


 
Staraya   (2003-03-17 13:29) [16]

> Desdechado
Моя проблема именно в том, что я не знаю как подставлять параметры из edit"ов. Если не очень Вас затруднит, объясните мне пожалуйста


 
Johnmen ©   (2003-03-17 13:36) [17]

>MsGuns © (17.03.03 13:22)

Возражаю ! :) Но помогать буду, если смогу... :))))

>zacho © (17.03.03 13:22)

Возможно. Я не проверял...


 
zacho ©   (2003-03-17 13:48) [18]


> Staraya (17.03.03 13:29)

Если именно параметры, то примерно так: DataSet.ParamByName("MY_PARAM").AsString=Edit.text
P.S. Настоятельно советую не использовать BDE. Лучше IBX(входит в поставку Дельфи) или FIBPlus,IBO(нужно покупать отдельно)


 
myor ©   (2003-03-17 13:50) [19]

Staraya (17.03.03 13:29)

я бы написал хп на вставку (в ibconsole)
...
procedure table1_insert(field1 char(15), field2 integer)
...
insert into table1(field1, field2)
values (:field1, :field2)
...
а потом (в проге):
...
with ibstoredproc1 do begin
prepare;
params[0].asstring:=edit1.text;
params[1].asinteger:=edit2.text;
...
execproc;
end;


 
MsGuns ©   (2003-03-17 13:53) [20]

>Johnmen © (17.03.03 13:36
>Возражаю ! :) Но помогать буду, если смогу... :))))

Звонок в дверь к молодоженам. Открывают оба.
Стоит мужик и говорит:
- Создается клуб группового секса. Если не против, я вас туда запишу.
Молодые переглянулись и промолчали.
- Хорошо, я вас записываю.
Тут молодой муж :
- А сколько человек в этом клубе ?
- Пока трое: вы двое и я.
- Тогда я против !
- Ладно, тебя вычеркиваю !





 
zacho ©   (2003-03-17 13:54) [21]


> myor © (17.03.03 13:50)

IMHO, для вставки одной записи в таблицу, ХП - явное излишество.
Да и не дает никаких преимуществ перед тем же самым INSERT в TIBSql

> Johnmen © (17.03.03 13:36)

Я проверял, работает :-)


 
MsGuns ©   (2003-03-17 13:57) [22]

>Johnmen © (17.03.03 13:36
>Возражаю ! :) Но помогать буду, если смогу... :))))

Звонок в дверь к молодоженам. Открывают оба.
Стоит мужик и говорит:
- Создается клуб группового секса. Если не против, я вас туда запишу.
Молодые переглянулись и промолчали.
- Хорошо, я вас записываю.
Тут молодой муж :
- А сколько человек в этом клубе ?
- Пока трое: вы двое и я.
- Тогда я против !
- Ладно, тебя вычеркиваю !





 
myor ©   (2003-03-17 13:59) [23]

zacho © (17.03.03 13:54)
а где сказано, что запись одна?
имхо, для одной записи, таблица (бд)- явное излишество. :)
или, имеется в виду, вставка одной записи за одиу операцию insert?


 
zacho ©   (2003-03-17 14:06) [24]


> myor © (17.03.03 13:59)
> или, имеется в виду, вставка одной записи за одиу операцию
> insert?

Ага. Насколько я понял, исходный вопрос касался все-таки одной записи, а не нескольких сразу.


 
myor ©   (2003-03-17 14:12) [25]

да ради бога, вариантов куча. можно хоть через table1.appendrecord([edit1.text, edit2.text]).


 
Staraya   (2003-03-17 14:29) [26]

У меня в программе должен быть документ "Поступление материалов". Пользователь вводит в поля edit1,edit2 значения, которые соответствуют полям "invent"и "kol_vo"в таблице detal удаленной базы, а потом нажимает на кнопочку "Записать".Так вот, я никак не могу реализовать, чтобы вводимые данные записывались в таблицу detal. Уже совсем запуталась. Подскажите пожалуйста оптимальное решение


 
Соловьев ©   (2003-03-17 14:38) [27]


> я никак не могу реализовать, чтобы вводимые данные записывались
> в таблицу detal

Query1.SQL:
Insert into table(invert, kol_vo)
values(:pInvert, : pKol_vo)

В проге на событие BtnClick:
...
with Query1 do
begin
Close;
ParamByName("pInvert").AsString{?} := Edit1.Text;
ParamByName("pInvert").AsString{?} := Edit1.Text;
if not Prepared then Prepare;
ExecSQL;
end;
Transaction.CommitReteaning;
...


 
Staraya   (2003-03-17 14:59) [28]

> Соловьев
Спасибо за подробное объяснение и помощь


 
Staraya   (2003-03-17 15:09) [29]

> zacho
Чтобы мне использовать IBX, я должна создать New Package в среде Delphi и инсталлировать компоненты IBX? Или как-то по-другому?Только не понятно где я должна их взять. У меня на компе есть папка Demos\db\ibx, но я не уверена, что это то, что мне нужно.


 
myor ©   (2003-03-17 15:43) [30]

Staraya (17.03.03 15:09
зачем ibx?
см. Соловьев © (17.03.03 14:38), только там ошибочка:

Query1.SQL:
Insert into table(invert, kol_vo)
values(:pInvert, : pKol_vo)

В проге на событие BtnClick:
...
with Query1 do
begin
Close;
ParamByName("pInvert").AsString{?} := Edit1.Text;
ParamByName(" pkol_vo").AsString{?} := Edit 2.Text;
if not Prepared then Prepare;
ExecSQL;
end;
Transaction.CommitReteaning;
...


используемые компоненты: query и transaction.


 
Соловьев ©   (2003-03-17 15:47) [31]


> myor © (17.03.03 15:43)

Ошибки сделаны специально, чтобы человек хоть чуть -чуть сам подумал:)))


 
myor ©   (2003-03-17 15:55) [32]

Соловьев © (17.03.03 15:47)
оригинальная интерпретация принципа "на ошибках учатся". лично мне нравится, но это- на любителя. самому приходилось учитьмся на очепятках в книгах. надо бы ввести этот метод обучение в широкое пользование.
ничто так не стимулирует обучение (познание), как непонимание.


 
Staraya   (2003-03-17 16:15) [33]

> myor
Я нашла только одну ошибку:
ParamByName("pInvert").AsString{?} := Edit1.Text;
ParamByName("pkol_vo").AsString{?} := Edit2.Text;
В данном примере параметр определяется своим именем в тексте запроса(Invert, kol_vo), но не именем в свойстве Name инспектора объектов(pInvert, pKol_vo). А есть еще ошибки?


 
myor ©   (2003-03-17 16:25) [34]

2 Staraya (17.03.03 16:15)

ParamByName("pInvert").AsString{?} := Edit1.Text;
ParamByName(" pInvert").AsString{?} := Edit 1.Text;
и
ParamByName("pInvert").AsString{?} := Edit1.Text;
ParamByName( "pkol_vo").AsString{?} := Edit 2.Text;

как вставка, работает?



 
Соловьев ©   (2003-03-17 16:30) [35]


> Insert into table(invert, kol_vo)

:)


 
Staraya   (2003-03-17 16:36) [36]

> myor
Я только что проверила, ввела несколько записей, все работает! И именно тогда, когда имя параметра "pKol_vo", а не "kol_vo", хотя в книжке написано, что первый вариант неправильный, странно


 
Соловьев ©   (2003-03-17 16:41) [37]

там у Query есть свойство Params - заходи туда и смотри какие у тебя параметры. Там же можно настроить: задать значения и вид.


 
myor ©   (2003-03-17 16:41) [38]

жизнь вообще странная штука...


 
zacho ©   (2003-03-17 17:02) [39]


> Staraya (17.03.03 15:09)

Нет,ничего специально делать не нужно, просто в палитре компонентов посмотри закладу Interbase.
Конечно, это зависит от версии Дельфи. В Enterprise точно должно быть, в Personal-нет :-).



Страницы: 1 вся ветка

Текущий архив: 2003.04.03;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.016 c
8-6614
ReYken
2002-12-27 13:11
2003.04.03
Может я и повторяюсь... он ответа я не нашел. Хоть и видел.


1-6525
OlegM
2003-03-21 06:06
2003.04.03
Комп и дистанционное управление


3-6324
Staraya
2003-03-16 21:42
2003.04.03
Вставка записи в бд


6-6647
gn
2003-02-07 18:21
2003.04.03
irc


3-6346
Денис
2003-03-12 22:29
2003.04.03
Кто на чем стал бы писать?