![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильное соединение с БД Interbase? [D5, IB5.x]
supersan © (2003-04-09 08:37:00)Господа, здравствуйте! Может, кто подскажет правильное соединение с БД Interbase? Я обычно делаю так (через стандартные компоненты): TIBDatabase(с БД), TIBTransaction(с TIBDatabase, хотя зачем это, не знаю :-)), TIBTable(с TIBDatabase, выбирая конкретную табличку, добавляю все поля через Add All Fields), TDataSourse(с TIBTable), далее TDBGridи т.д. В результате приходится еще добавлять TIBQuery, где ручками пишу все SQL (на Insert, Update, Delete). Остальные компоненты на закладке Interbase не использую. Нет ли более правильного соединения, где бы не пришлось бы писать все ручками, а использовать стандартные средства для модификации таблицы, предоставляемые TDBGrid и TDBNavigator? Спасибо за внимание, заранее благодарен. Если подскажете, где порядок соединения можно найти в Сети, то тоже нормально. Поля в таблицах разных типов, графику не использую.
Соловьев (2003-04-10 11:06:00) [21]property GeneratorField: TIBGeneratorField;
supersan (2003-04-10 10:55:00) [22]Sorry, сам накосячил - неправильно подсоединил :-( Исправил. Теперь при добавлении выдает ошибку "Field ID must have a value". А это поле - автоинкрементное. Если пытаться добавить запись в WISQL, то генерится ID корректно. В компонентах типа IBTable я устанавливал св-во Required столбца ID в False, тогда поле заполнялось автоматом. А тут как?
Еще раз прошу прощения за предыдущий ляпсус
supersan (2003-04-10 10:38:00) [23]ОК, с открытием и с "+" разобрался. Теперь при открытии формы, несмотря на то, что данная IDDataset активна, ни TGrid ни TNavigator не активны. Впечатление такое, что они связаны с закрытым НД. А это почему такая бяка? Или с IDDataset это нормально? Тогда как заактивизировать Grid и Navigator?
Соловьев (2003-04-10 10:05:00) [24]
> . В ModifySQL я "+" не ставил, это Delphi постаралась
такого не может быть.
> "SQL Parse Error: Parameter name expected"
> Это что за зверь? Насчет SelectSQL нет замечаний (см.
оставь только SelectSQL.Проверь. Потом добавь InsertSQL. Проверь. И т.д. Выясни в каком у тебя ошибка.
supersan (2003-04-10 09:01:00) [25]Ничего, что я так рано? У нас просто день уже. Никто не может мне помочь?
supersan (2003-04-10 06:45:00) [26]
> Zacho © (09.04.03 18:44)
> Во-первых что такое "На ID стоит генератор " ?
> Во-вторых InsertSQL должен быть таким INSERT INTO SPMINPENS
> (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
> В-третьих ModifySQL - UPDATE SPMINPENS SET MONEY=:MONEY,
> DATE_MP=:DATE_MP WHERE ID=:ID
> И без всяких скобок и "+"
Ага, спасибо. Только следующее.
1. На ID генератор - это значит, что есть
CREATE GENERATOR GEN_SPMINPENS_ID;
SET GENERATOR GEN_SPMINPENS_ID TO 0;
При добавлении стоит триггер, он автоинкрементит это поле. Остальные таблицы при такой же конструкции работают.
2. InsertSQL и ModifySQL исправил. В ModifySQL я "+" не ставил, это Delphi постаралась
3. Все равно данная TIBDataset не открывается. При попытке сделать ее активной выдается ошибка (повторю ее текст):
"SQL Parse Error: Parameter name expected"
Это что за зверь? Насчет SelectSQL нет замечаний (см. )
> supersan (09.04.03 18:26)
?
Zacho (2003-04-09 18:44:00) [27]Во-первых что такое "На ID стоит генератор " ?
Во-вторых InsertSQL должен быть таким INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
В-третьих ModifySQL - UPDATE SPMINPENS SET MONEY=:MONEY, DATE_MP=:DATE_MP WHERE ID=:ID
И без всяких скобок и "+"
supersan (2003-04-09 18:26:00) [28]
> Zacho © (09.04.03 17:42)
> Приведи SelectSQL, ModifySQL,InsertSQL,DeleteSQL и структуру
> таблицы.
> Тогда что-нибудь можно будет сказать.
Выполняю.База:
/* Domains */
CREATE DOMAIN T_ID AS
INTEGER
NOT NULL;
CREATE DOMAIN T_DATE AS
DATE
NOT NULL;
CREATE DOMAIN T_MONEY AS
NUMERIC(9,2)
NOT NULL;
CREATE DOMAIN T_DELETED AS
CHAR(1)
DEFAULT "0"
COLLATE PXW_CYRL;
/* Tables */
CREATE TABLE SPMINPENS (
ID T_ID,
MONEY T_MONEY,
DATE_MP T_DATE,
DELETED T_DELETED COLLATE PXW_CYRL
);
На ID стоит генератор (его нужно?)
В Delphi5 (!)
TIBDatabase + TIBTransaction + TIBDataset + TDatasource + (TGrid + TNavigator)
В TIBDataset:
InsertSQL.Strings = ("INSERT INTO SPMINPENS (Money, Date_MP)
VALUES (:Money,: Date_MP)")
SelectSQL.Strings = ("select ID, MONEY, DATE_MP, DELETED from
SPMINPENS")
ModifySQL.Strings = ("UPDATE SPMINPENS SET (Money=:MONEY,
Date_MP=:DATE_MP) WHERE ID=:" +"ID")
(скопировал из файла dfm)
DeleteSQL пока не делал, т.к. надо при удалении не физически удалить, а присвоить полю Deleted значение "1"
Что-нибудь еще нужно?
Johnmen (2003-04-09 17:54:00) [29]Читать, вникать и т.д. ibx.hlp или fibplushelp.hlp
(лучше хелпов объяснить трудно и долго)
Избавление одно - не делать ошибок...:)
Zacho (2003-04-09 17:42:00) [30]Приведи SelectSQL, ModifySQL,InsertSQL,DeleteSQL и структуру таблицы.
Тогда что-нибудь можно будет сказать.
Соловьев (2003-04-09 17:40:00) [31]что в selectSQL написано?
supersan (2003-04-09 17:40:00) [32]
> Johnmen © (09.04.03 17:34)
В каком именно, извините? И как от такого избавиться? Плиз...
supersan (2003-04-09 17:38:00) [33]
> Zacho © (09.04.03 17:24)
Попробовал так. При попытке открытия выдает ошибку: "SQL Parse Error: Parameter name expected" Извините, если кажусь глупым, но ведь если бы все шло как задумано, то и вопроса бы не возникло...
Johnmen (2003-04-09 17:34:00) [34]SQLDA - SQL descriptor area
Далее можно привести что, зачем и почему...
Да только в соответствующем .hlp все достаточно разжевано...
Zacho (2003-04-09 17:24:00) [35]Ну а что "оно" за тебя должно делать ? Почитай книжки какие-нибудь, чтобы понимать как работать в Дельфи с ДБ. Без элементарныхзнаний никие FIBPlus не помогут.
В общем, простой пример.
Пусть в БД есть таблица MY_TABLE. В ней есть поля ID (первичный ключ) и SOME_FIELD (какое-то еще поле). Для простоты предположим, что ID заполняется генератором при вставке записи (например в событии OnNewRecord или с помощью свойства GeneratorField) из приложения и редактироваться не может. Для доступа к таблице будем использовать TIBDataSet c иминем IBDataSet. (естественно, должны быть еще TIBDataBase и TIBTransaction). Тогда:
1. Ложим на форму TDataSource. В свойстве DataSet указываем IBDataSet.
2. В свойстве DataSource DBGrid"a указываем этот DataSource.
3. В св-ве SelectSQL у IBDataSet пишем SELECT * FROM MY_TABLE
4. В ModifySQL - UPDATE MY_TABLE SET SOME_FIELD=:SOME_FIELD WHERE ID=:ID
5. В InsertSQL - INSERT INTO MY_TABLE (ID,SOME_FIELD) VALUES (:ID,:SOME_FIELD)
6. В DeleteSQL - DELETE FROM MY_TABLE WHERE ID=:ID
И все работает.
supersan (2003-04-09 17:18:00) [36]
> Соловьев © (09.04.03 17:09)
> IBDataSet - там все легко.
А как его со всеми правильно соединить?
> хоть ошибки выдает?
Выдает (см пред мое замечание)
Соловьев (2003-04-09 17:09:00) [37]
> Хочу сделать в TGrid, TIBUpdateSQL использовал, сгенерил
> SQL для вставки и т.п., а оно за меня не делает. Может,
> что еще не учел?
IBDataSet - там все легко.
> с полями типа Integer и Varchar), а в других - нет (поля
> Numeric и Date). Почему так?
хоть ошибки выдает?
supersan (2003-04-09 17:08:00) [38]
> Elvira (09.04.03 10:16)
PS Вот, буквально сейчас попробовал добавить запись. Выдает какое-то непереваримое "Project *** raised exception class EIBInterBaseError with message "Dynamic SQL Error SQL error code=-804 Incoorect values within SQLDA structure" и т.д."
Что это за оно такое, не знаете?
supersan (2003-04-09 17:00:00) [39]Наконец-то добрался. Отвечаю на замечания
> Соловьев © (09.04.03 10:05)
> Не ври, такого не бывает. Грид только отображает данные,
> а навигатор только переводит НД в режимы: редактирование
> и т.д.
Я имел в виду, что при нажатии кнопки Insert в TNavigator можно добавить запись в TGrid, а потом запостить нажатием на кнопку Post. Я же этого и хочу добиться. Причем в некоторых таблицах это получается (с полями типа Integer и Varchar), а в других - нет (поля Numeric и Date). Почему так?
> Elvira (09.04.03 10:16)
> А не пойму ты модификацию делаешь в DBGrid или в форме ввода
> в DBEdit.
> В прочем и в том и в другом случае просто связываешь DBEdit
> или столбцы DBGrid с полями таблицы(как обычно). При модификации
> таблицы пишешь IBTable.Insert(Edit)... ну ты понял.
> Или если пользуешься Navigatore и того не надо.
> Все остальное TIBUpdateSQL сделает за тебя.
>
> А FIBPlus помоему есть здесь http://www.ibase.ru
Хочу сделать в TGrid, TIBUpdateSQL использовал, сгенерил SQL для вставки и т.п., а оно за меня не делает. Может, что еще не учел?
FIBPlus там действительно есть, но для D3 (freeware). Для D5 их установить не удалось :-(
Elvira (2003-04-09 10:16:00) [40]А не пойму ты модификацию делаешь в DBGrid или в форме ввода в DBEdit.
В прочем и в том и в другом случае просто связываешь DBEdit или столбцы DBGrid с полями таблицы(как обычно). При модификации таблицы пишешь IBTable.Insert(Edit)... ну ты понял.
Или если пользуешься Navigatore и того не надо.
Все остальное TIBUpdateSQL сделает за тебя.
А FIBPlus помоему есть здесь http://www.ibase.ru