Форум: "Базы";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизПравильное соединение с БД Interbase? Найти похожие ветки
← →
supersan (2003-04-09 08:37) [0]Господа, здравствуйте! Может, кто подскажет правильное соединение с БД Interbase? Я обычно делаю так (через стандартные компоненты): TIBDatabase (с БД), TIBTransaction (с TIBDatabase, хотя зачем это, не знаю :-)), TIBTable (с TIBDatabase, выбирая конкретную табличку, добавляю все поля через Add All Fields), TDataSourse (с TIBTable), далее TDBGrid и т.д. В результате приходится еще добавлять TIBQuery, где ручками пишу все SQL (на Insert, Update, Delete). Остальные компоненты на закладке Interbase не использую. Нет ли более правильного соединения, где бы не пришлось бы писать все ручками, а использовать стандартные средства для модификации таблицы, предоставляемые TDBGrid и TDBNavigator? Спасибо за внимание, заранее благодарен. Если подскажете, где порядок соединения можно найти в Сети, то тоже нормально. Поля в таблицах разных типов, графику не использую.
← →
Alexandr (2003-04-09 08:51) [1]TIBdataSet
← →
Zacho (2003-04-09 08:53) [2]
> supersan (09.04.03 08:37)
> TIBDatabase (с БД), TIBTransaction (с TIBDatabase, хотя
> зачем это, не знаю :-))
Что зачем не знаешь ? Если не знаешь, зачем TIBTransaction, то читай какую-нибудь литературу по RDBMS и статьи о транзакциях в IB на http://www.ibase.ru
> В результате приходится еще добавлять TIBQuery, где ручками
> пишу все SQL (на Insert, Update, Delete).
В результате чего ?
> Нет ли более правильного соединения, где бы не пришлось
> бы писать все ручками, а использовать стандартные средства
> для модификации таблицы, предоставляемые TDBGrid и TDBNavigator?
>
"Не писать все ручками" получится только в простейших случаях. "Средства для модификации таблицы" предоставляет не TDBGrid и т.п. а связанный с ним TDataSet (IBTable,IBQuery,IBDataSet). Если тебе нужно выбирать на клиента все записи одной таблицы - используй TIBTable. Правда, в клиент-серверных приложениях это довольно редкий случай. Для запросов сложнее чем SELECT ... FROM ... используй TIBQuery или TIBDataSet. В некотрых случаях использование TIBQuery - проще, но TIBDataSet - универсальнее.
И что такое в твоем понимании порядок соединения ? Соединения чего ?
И почитай хорошенько хелп по IBX чтобы понимать какие компоненты для чего и чем отличается TIBTable, TIBQuery, TIBDataSet.
Еще советую хорошенько изучить сайт http://www.ibase.ru , особенно http://www.ibase.ru/develop.htm
← →
Карелин Артем (2003-04-09 08:54) [3]>TIBTable (с TIBDatabase, выбирая конкретную табличку, добавляю все поля через Add All Fields)
Зачем добавлять все поля?? Достаточно просто не делать это :)
И TIBTable советую заменить на TIBQuery с запросом типа Select.
Так все нормально, вот только связав TIBQuery и TIBUpdateSQL можно получить "живой" запрос (прописав необходимые параметризированные запросы в соотв. свойствах TIBUpdateSQL).
← →
El (2003-04-09 09:01) [4]Для модификации таблицы существует компонент TIBUpdateSQL
Его связываешь с TIBTable через св-во UpdateObject
В окне редактора TIBUpdateSQL делаешь GenerateSQL и не придется писать все ручками.
Или используй TIBDataSet вместо пары TIBTable и TIBUpdateSQL
A еще лучше переходи на компоненты FIBPlus.
← →
supersan (2003-04-09 09:34) [5]Удалено модератором
← →
Соловьев (2003-04-09 09:50) [6]
> где поставить TEdit"ы, а потом в параметры SQL передавать
> набранные пользователем значения. Так?
А зачем тебе DBEdit?
← →
supersan (2003-04-09 09:56) [7]Да, кстати, никто, случайно, не знает паролей для установки InfoPower4000Pro или 1stclass3000Pro? Говорят, тоже хорошая штука, я видел проект, где они определенным образом настраиваются, тогда можно модификацию таблицы проводить в Gride и Navigatore (прям как в БД Paradox). К сожалению, проект был на Delphi3, а нужно Delphi5
← →
Zacho (2003-04-09 10:00) [8]И без всяких сторонних компонентов можно проводить модификацию таблиц в TDBGrid. Почитай какую-либо литературу по работе с БД в Дельфи.
← →
Соловьев (2003-04-09 10:05) [9]
> модификацию таблицы проводить в Gride и Navigatore (прям
> как в БД Paradox
Не ври, такого не бывает. Грид только отображает данные, а навигатор только переводит НД в режимы: редактирование и т.д.
← →
Elvira (2003-04-09 10:16) [10]А не пойму ты модификацию делаешь в DBGrid или в форме ввода в DBEdit.
В прочем и в том и в другом случае просто связываешь DBEdit или столбцы DBGrid с полями таблицы(как обычно). При модификации таблицы пишешь IBTable.Insert(Edit)... ну ты понял.
Или если пользуешься Navigatore и того не надо.
Все остальное TIBUpdateSQL сделает за тебя.
А FIBPlus помоему есть здесь http://www.ibase.ru
← →
supersan (2003-04-09 17:00) [11]Наконец-то добрался. Отвечаю на замечания
> Соловьев © (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 их установить не удалось :-(
← →
supersan (2003-04-09 17:08) [12]
> 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" и т.д."
Что это за оно такое, не знаете?
← →
Соловьев (2003-04-09 17:09) [13]
> Хочу сделать в TGrid, TIBUpdateSQL использовал, сгенерил
> SQL для вставки и т.п., а оно за меня не делает. Может,
> что еще не учел?
IBDataSet - там все легко.
> с полями типа Integer и Varchar), а в других - нет (поля
> Numeric и Date). Почему так?
хоть ошибки выдает?
← →
supersan (2003-04-09 17:18) [14]
> Соловьев © (09.04.03 17:09)
> IBDataSet - там все легко.
А как его со всеми правильно соединить?
> хоть ошибки выдает?
Выдает (см пред мое замечание)
← →
Zacho (2003-04-09 17:24) [15]Ну а что "оно" за тебя должно делать ? Почитай книжки какие-нибудь, чтобы понимать как работать в Дельфи с ДБ. Без элементарных знаний никие 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
И все работает.
← →
Johnmen (2003-04-09 17:34) [16]SQLDA - SQL descriptor area
Далее можно привести что, зачем и почему...
Да только в соответствующем .hlp все достаточно разжевано...
← →
supersan (2003-04-09 17:38) [17]
> Zacho © (09.04.03 17:24)
Попробовал так. При попытке открытия выдает ошибку: "SQL Parse Error: Parameter name expected" Извините, если кажусь глупым, но ведь если бы все шло как задумано, то и вопроса бы не возникло...
← →
supersan (2003-04-09 17:40) [18]
> Johnmen © (09.04.03 17:34)
В каком именно, извините? И как от такого избавиться? Плиз...
← →
Соловьев (2003-04-09 17:40) [19]что в selectSQL написано?
← →
Zacho (2003-04-09 17:42) [20]Приведи SelectSQL, ModifySQL,InsertSQL,DeleteSQL и структуру таблицы.
Тогда что-нибудь можно будет сказать.
← →
Johnmen (2003-04-09 17:54) [21]Читать, вникать и т.д. ibx.hlp или fibplushelp.hlp
(лучше хелпов объяснить трудно и долго)
Избавление одно - не делать ошибок...:)
← →
supersan (2003-04-09 18:26) [22]
> 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"
Что-нибудь еще нужно?
← →
Zacho (2003-04-09 18:44) [23]Во-первых что такое "На 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-10 06:45) [24]
> 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)
?
← →
supersan (2003-04-10 09:01) [25]Ничего, что я так рано? У нас просто день уже. Никто не может мне помочь?
← →
Соловьев (2003-04-10 10:05) [26]
> . В ModifySQL я "+" не ставил, это Delphi постаралась
такого не может быть.
> "SQL Parse Error: Parameter name expected"
> Это что за зверь? Насчет SelectSQL нет замечаний (см.
оставь только SelectSQL.Проверь. Потом добавь InsertSQL. Проверь. И т.д. Выясни в каком у тебя ошибка.
← →
supersan (2003-04-10 10:38) [27]ОК, с открытием и с "+" разобрался. Теперь при открытии формы, несмотря на то, что данная IDDataset активна, ни TGrid ни TNavigator не активны. Впечатление такое, что они связаны с закрытым НД. А это почему такая бяка? Или с IDDataset это нормально? Тогда как заактивизировать Grid и Navigator?
← →
supersan (2003-04-10 10:55) [28]Sorry, сам накосячил - неправильно подсоединил :-( Исправил. Теперь при добавлении выдает ошибку "Field ID must have a value". А это поле - автоинкрементное. Если пытаться добавить запись в WISQL, то генерится ID корректно. В компонентах типа IBTable я устанавливал св-во Required столбца ID в False, тогда поле заполнялось автоматом. А тут как?
Еще раз прошу прощения за предыдущий ляпсус
← →
Соловьев (2003-04-10 11:06) [29]property GeneratorField: TIBGeneratorField;
← →
supersan (2003-04-10 11:17) [30]Товарищи мои дорогие!
Пожалуйста, кто знает, что такое "Dynamic SQL Error SQL error code = -804 Incorect values within SQLDA structure", возникает при попытке добавления/изменение таблицы SPMINPENS (описание см. выше) > supersan (09.04.03 18:26), а, главное, как от него избавиться и заполнить-таки таблицу эту!!!
На www.ibase.ru я что-то такое не нашел...
PS Пытаюсь, переведя IBDataset в режим Insert, ввести следующие значения: в поля MONEY и DATE_MP соответственно 200 и 01.01.2001
← →
supersan (2003-04-10 11:22) [31]
> Соловьев © (10.04.03 11:06)
> property GeneratorField: TIBGeneratorField;
Это где ж такое свойство? В IBDataset нет, по крайней мере, при <Ctrl>+<Space> его не показывает. Да я нашел, что есть аналогичное (т.е. Required) св-во, его тоже в False - и все ОК. Так что с этим справился. Только остается ошибка (см. пред.)
← →
Соловьев (2003-04-10 11:26) [32]
> при <Ctrl>+<Space> его не показывает
при это много чего не показывает, например FieldByName? поэтому же не стоит судить что этого свойства нет. Оно есть например в Object Inspector.
← →
supersan (2003-04-10 11:34) [33]
> Оно есть например в Object Inspector.
Ну нет его в Object Inspector. Есть что-то похожее, property AutoGenerateValue, его можно установить, в частности, в arAutoInc. Ну это шут с ним. Как насчет ошибки ( > supersan (10.04.03 11:17))?
← →
Соловьев (2003-04-10 11:38) [34]Оттестируй свой запрос на изменение в IBConcol, там и найдешь свою ошибку.
← →
supersan (2003-04-10 12:23) [35]
> Соловьев © (10.04.03 11:38)
> Оттестируй свой запрос на изменение в IBConcol, там и найдешь
> свою ошибку.
Извините, не совсем понял, что имеется в виду. Если имеется в виду TDBGrid, то непонятно, как там тестировать. Если имеется в виду правильность составления SQL, то, повторяю, в WISQL подобный запрос проходит бех проблем
Пример. В WISQL запрос
insert into spminpens (MONEY, DATE_MP) values (100,"01.01.2001")
Результат:
select * from spminpens
ID MONEY DATE_MP DELETED
=========== =========== =========== =======
1 100.00 1-JAN-2001 0
В Delphi
IBDataset.InsertSQL:
INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
В TGrid вывожу поля MONEY и DATE_MP, заполняю при добавлении значениями 100 и 01.01.2001 соответственно. Выдается ошибка.
Что не так делаю?
← →
AlexSerp (2003-04-10 13:06) [36]Выбрось из вставки ID.
← →
supersan (2003-04-10 13:21) [37]
> AlexSerp © (10.04.03 13:06)
> Выбрось из вставки ID
Ну сделал, попробовал - все равно фигня (извиняюсь), т.е. та же ошибка. Не в ID дело, как мне кажется, а в том, что, возможно, Interbase неправильно воспринимает заполнение поля типа DATE и/или NUMERIC. Может, с ними надо что-то сделать? Если да, то на что обратить внимание? Елки-палки, неужели только у меня такое дело встретилось? Если у кого получалось заполнение полей типа DATE и/или NUMERIC, опишите соединение компонентов, плиз, и их настройку, тоже плиз. Желательно, если будут только стандартные Дельфовские компоненты, можно из Rx Library. Если нужны какие еще, то подскажите, где взять ( для Delphi 5) и кряки к ним(плиз сто раз). А то, может, вышлите на supersanpovt@mail.ru? Ну господа, вторые сутки бьемся над энтим делом, нешто столь времени нужно на простое (по идее) дело? И большая просьба: может перед подачей совета прочитаете историю переговоров? Там уже много советовали...
← →
AlexSerp (2003-04-10 13:45) [38]Посмотри еще региональные настройки на десятичный разделитель и формат даты в системе.
← →
Соловьев (2003-04-10 13:55) [39]
> :
> INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
может поробовать привести к формату дату? CAST(... as TimeStamp)
← →
supersan (2003-04-10 14:11) [40]
> Соловьев © (10.04.03 13:55)
> может поробовать привести к формату дату? CAST(... as TimeStamp)
НА ДАТУ ОН КАК РАЗ НЕ РУГАЕТСЯ. Счас попробовал создать две таблички, одна - с DATE, другая - с NUMERIC. Первая заполняется без проблем, причем даже с TIBTable. Вторая и выдает энту самую пресловутую ошибку.
> AlexSerp © (10.04.03 13:45)
> Посмотри еще региональные настройки на десятичный разделитель
> и формат даты в системе
В том-то и дело, что я ввожу число БЕЗ десятичной точки (пока, но потом буду с ней)
Итак, дело в NUMERIC. Будут какие-нибудь соображения на этот счет?
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.009 c