Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Delphi 2010 & Firebird 2.1


Автор: Keeper89 5.4.2010, 09:17
Доброго времени суток.

Есть ли у кого материалы по сабжу? smile

1) В чем лучше (визуальное средство) проектировать, изменять БД Firebird?
2) Как работать с Firebird'ом в Delphi через dbExpress (может есть примеры)?

Заранее спасибо.

Автор: Deniz 5.4.2010, 10:58
Материалы http://www.ibase.ru/
Цитата(Keeper89 @  5.4.2010,  11:17 Найти цитируемый пост)
1) В чем лучше (визуальное средство) проектировать, изменять БД Firebird?
http://forum.vingrad.ru/forum/topic-149469/kw-ibexpert-fbscanner.html
Цитата(Keeper89 @  5.4.2010,  11:17 Найти цитируемый пост)
2) Как работать с Firebird'ом в Delphi через dbExpress (может есть примеры)?
Delphi 2010 еще не видел, обычно еще есть IBX, но из компонент лучше http://www.devrace.com/ru/fibplus/index.php

Автор: Alexeis 5.4.2010, 12:53
Цитата(Deniz @  5.4.2010,  09:58 Найти цитируемый пост)
Delphi 2010 еще не видел, обычно еще есть IBX

  Использую их. БД в формате UTF8 постоянно имею проблемы с преобразованием типов строк. Все они безусловно решаются положительно, но писать такой код неудобно, чуть забыл написать преобразование и выползли кракозяблы. Смотрел код FIBPlus. Они заметно лучше, но стоят денег. Так что это вопрос нужно оно вам настолько что вы готовы за это платить.

Автор: ReptileDB 6.4.2010, 12:44
Сейчас пишу софт с использованием Delphi 2010 & Firebird 2.1, но из  dbExpress использую только SQLConnection, а вот от остальных компонент отказался по причине того, что тупо не отлавливает Exceptions которые я специально генерирую в хранимых процедурах.

Автор: Akella 6.4.2010, 16:25
Цитата(Keeper89 @  5.4.2010,  09:17 Найти цитируемый пост)
2) Как работать с Firebird'ом в Delphi через dbExpress (может есть примеры)?

А в стандартной поставке примеров нет?

Добавлено через 1 минуту и 25 секунд
Цитата(Alexeis @  5.4.2010,  12:53 Найти цитируемый пост)
 Использую их. БД в формате UTF8 постоянно имею проблемы с преобразованием типов строк. Все они безусловно решаются положительно, но писать такой код неудобно, чуть забыл написать преобразование и выползли кракозяблы.

А в параметрах соединение ставишь UTF-8 и всё равно кракозябры?

Автор: Alexeis 6.4.2010, 16:49
Цитата(Akella @  6.4.2010,  15:25 Найти цитируемый пост)
А в параметрах соединение ставишь UTF-8 и всё равно кракозябры? 

  А с чего вдруг у меня должны быть не кракозяблы если результат всегда приходит в UTF8, а компоненты не позволяют получать результат AsUTF8String ? Результат приходит совершенно правильный. Есть 2 варианта AsWideString и AsAnsiString. И то и другое не соответствует нативному типу. Сам движок не знает что тип строки это UTF8 обернутый в AnsiString.
  Скажем так, в байтовом представлении приходит верный результат, если бы он сам знал что в варианте у него фактически UTF8, то все строковые преобразования работали по присваиванию. Но исходники IBX таковы что установка режима UTF8 ничего внутри него не меняет кроме состояния поля объекта. Т.е. можно прочитать поле объекта и узнать что тип соединения UTF8, но сам IBX проинтерпретирует полученную строку как AnsiString. 

Автор: Keeper89 9.4.2010, 15:43
Цитата(Deniz @  5.4.2010,  10:58 Найти цитируемый пост)
Delphi 2010 еще не видел, обычно еще есть IBX, но из компонент лучше FIBPlus 

А что если работать через
SQLConnection -> SQLDataSet/SQLQuery -> DataSetProvider -> ClientDataSet -> DataSource
?

Автор: Akella 9.4.2010, 20:27
Keeper89, давай ещё цепочку продолжим тремя-четырьмя компонентами, а? А то что-то короткая цепочка smile 

Автор: Keeper89 10.4.2010, 00:11
Akella, дальше некуда )

Автор: Keeper89 11.4.2010, 00:45
Расположил на форме все вышеуказанное + пару DBEdit'ов и DBNavigator.

После добавления записи с помощью последнего, на форме запись имеется, но в самой базе ее нет.
Что я делаю не так? smile

Автор: Данкинг 11.4.2010, 00:53
Я с DBNavigator не работал, поэтому за него не скажу, но замечу, что при добавлении записей надо не забывать подтверждать транзакцию:
Код

IBTransaction1.CommitRetaining();




Автор: Keeper89 11.4.2010, 23:18
Не ну понятное дело, что нужно делать
Код

ClientDataSet1.ApplyUpdates

но вот в какой момент... smile

Автор: VahaC 12.4.2010, 00:55
Keeper89, 
Цитата(Данкинг @  11.4.2010,  00:53 Найти цитируемый пост)
что при добавлении записей надо не забывать подтверждать транзакцию:
Код

IBTransaction1.CommitRetaining();



и

Код

ClientDataSet1.ApplyUpdates


немного разные вещи

Автор: Keeper89 12.4.2010, 02:02
VahaC, 
А что нужно?

И почему навигатор не может сделать это сам?

Автор: VahaC 12.4.2010, 08:45
Для сохранения изменений в таблице бд нужно сделать ClientDataSet1.ApplyUpdates или ClientDataSet1.Post
и потом закрыть транзакцию (IBTransaction1.CommitRetaining();) в контексте которой вносились изменения.
Как это сделать с помощью ДБНавигатора к сожалению не знаю, так как в своих проектах его не использую

Автор: former 12.4.2010, 10:27
Цитата(VahaC @  12.4.2010,  08:45 Найти цитируемый пост)
Как это сделать с помощью ДБНавигатора к сожалению не знаю, так как в своих проектах его не использую

DBNavigator тут не причем. Подтверждать транзакцию нужно в ClientDataSet, в триггере AfterPost. Ну и, соответственно, выполнять откат при ошибке (OnPostError  и т.п.).

Автор: VahaC 12.4.2010, 11:14
Цитата(former @  12.4.2010,  10:27 Найти цитируемый пост)
Подтверждать транзакцию нужно в ClientDataSet, в триггере AfterPost. Ну и, соответственно, выполнять откат при ошибке (OnPostError  и т.п.).

полностью согласен

Автор: Keeper89 12.4.2010, 12:30
Цитата(former @  12.4.2010,  10:27 Найти цитируемый пост)
DBNavigator тут не причем. Подтверждать транзакцию нужно в ClientDataSet, в триггере AfterPost. Ну и, соответственно, выполнять откат при ошибке (OnPostError  и т.п.). 

ок, а как это должно выглядеть в коде?

Автор: former 12.4.2010, 12:42
Код

procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
  IBTransaction1.CommitRetaining();
end;

procedure TForm1.ClientDataSet1PostError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
  IBTransaction1.Rollback();
end;

Автор: Keeper89 12.4.2010, 12:46
А что есть IBTransaction1? smile 


+ другой маленький вопрос (не буду делать отдельную тему). Имеется триггер (и соотв. генератор) на BeforeInsert для ID-поля. При вставке новой записи в IBExpert'е автоматически добавляется новый ID как и положено, однако при попытке добавления записи в Delphi такого не происходит. В чем может быть дело?

Автор: former 12.4.2010, 13:15
Цитата(Keeper89 @  12.4.2010,  12:46 Найти цитируемый пост)
А что есть IBTransaction1?

Так ты используешь  dbExpress. А я так понял, что после сообщения Данкинг-а IBX. smile 
Вот http://www.sql.ru/Forum/actualthread.aspx?bid=2&tid=502943&hl=.

Цитата(Keeper89 @  12.4.2010,  12:46 Найти цитируемый пост)
В чем может быть дело? 

Тело триггера в студию.

Автор: Данкинг 12.4.2010, 14:41
Цитата(former @  12.4.2010,  14:15 Найти цитируемый пост)
Так ты используешь  dbExpress. А я так понял, что после сообщения Данкинг-а IBX. 

А, ну да, я про IBX, разумеется. Там без IBTransaction работать и не будет.

Автор: Keeper89 12.4.2010, 15:29
Цитата(former @  12.4.2010,  13:15 Найти цитируемый пост)
Вот статья.

Очень она пессимистичная smile

В моем случае никак? smile

Цитата(former @  12.4.2010,  13:15 Найти цитируемый пост)
Тело триггера в студию. 

Код

AS
BEGIN
  IF (NEW.PRODUCTID IS NULL) THEN
    NEW.PRODUCTID = GEN_ID(GEN_PRODUCT_ID,1);
END

Автор: Akella 12.4.2010, 15:32
Цитата(Keeper89 @  12.4.2010,  12:46 Найти цитируемый пост)
А что есть IBTransaction1?

Это транзакция. Транзакции в базах данных ухх как важны!
http://kenal.info/baset5r3part1.html

Автор: Keeper89 12.4.2010, 15:38
Цитата(Akella @  12.4.2010,  15:32 Найти цитируемый пост)
Это транзакция. Транзакции в базах данных ухх как важны!
Транзакция - это совокупность действий... 

Спасибо за напоминание smile

Автор: Akella 12.4.2010, 15:55
Цитата(Keeper89 @  12.4.2010,  12:46 Найти цитируемый пост)
однако при попытке добавления записи в Delphi такого не происходит. В чем может быть дело? 

А что ты передаёшь серверу, NULL?
Цитата(Keeper89 @  12.4.2010,  15:29 Найти цитируемый пост)
 IF (NEW.PRODUCTID IS NULL)

Согласно условий ты должен передать NULL в запросе для этого поля. А лучше вообще не передавать это поле:
Код
insert into table1 (name, BirthDay) values ('Вася Пупкин', '2001-01-12')


Добавлено @ 15:56
Или если НЕ передаёшь NULL, то должен передать конкретное значение:
Код
insert into table1 (id, name, BirthDay) values (10, 'Вася Пупкин', '2001-01-12')

Автор: Keeper89 12.4.2010, 20:01
Цитата(Akella @  12.4.2010,  15:55 Найти цитируемый пост)
А что ты передаёшь серверу, NULL?

Ничего не передаю.

У меня есть ClientDataSet, для добавления я делаю ClientDataSet.Insert, заполняю только нужные поля (через DBEdit'ы), и дальше ClientDataSet.Post.

Автор: Akella 13.4.2010, 10:41
Цитата(Keeper89 @  12.4.2010,  12:46 Найти цитируемый пост)
При вставке новой записи в IBExpert'е автоматически добавляется новый ID как и положено, однако при попытке добавления записи в Delphi такого не происходит. В чем может быть дело? 

Хорошо. А что значит "ничего не происходит"? Что ты под этим подразумеваешь? Что ты ожидаешь? Что должно произойти?

Автор: Keeper89 13.4.2010, 11:55
Цитата(Akella @  13.4.2010,  10:41 Найти цитируемый пост)
Хорошо. А что значит "ничего не происходит"? Что ты под этим подразумеваешь? Что ты ожидаешь? Что должно произойти? 

Я подразумеваю, что при Post'е незаполненные поля (которые по идее передаются как NULL) заполнятся автоматически на основании триггеров. А выдается ошибка, что поле должно быть заполнено.

Автор: Akella 14.4.2010, 09:05
Наверное, это связано с внутренней реализацией компонент. Поэтому два выхода.
1. В клиентской части приложения берём значение генератора и передаём в запросе, как и все остальные поля.
2. Поле ID вообще не должно участвовать в запросе. Зачем ты его туда пхаешь?

Автор: former 14.4.2010, 09:30
Keeper89, выложи пример того, что ты делаешь. Тяжело гадать на кофейной гуще.

Автор: Keeper89 15.4.2010, 02:46
Цитата(Akella @  14.4.2010,  09:05 Найти цитируемый пост)
Поле ID вообще не должно участвовать в запросе. Зачем ты его туда пхаешь? 

Я его не трогаю, просто при Insert'е он добавляет все поля, и это тоже.

Автор: Akella 15.4.2010, 12:41
1. Кто "он"? И куда добавляет? В SQL запрос?

2. вот же пример
Код
insert into table1 (name, BirthDay) values ('Вася Пупкин', '2001-01-12')

вставь его в кверю и выполни... как видишь, здесь нет поля ID

Автор: Keeper89 15.4.2010, 13:23
Цитата(Akella @  15.4.2010,  12:41 Найти цитируемый пост)
1. Кто "он"? И куда добавляет? В SQL запрос?

ClientDataSet через Insert и Post.
Цитата(Akella @  15.4.2010,  12:41 Найти цитируемый пост)
вставь его в кверю и выполни... как видишь, здесь нет поля ID

попробую

Автор: Akella 15.4.2010, 16:12
Цитата(Keeper89 @  15.4.2010,  13:23 Найти цитируемый пост)
ClientDataSet через Insert и Post.

А откуда ты знаешь, какие значение передаёт серверу ClientDataSet? И зачем он ваще нужен это ClientDataSet?

Автор: Keeper89 15.4.2010, 21:14
Цитата(Akella @  15.4.2010,  16:12 Найти цитируемый пост)
А откуда ты знаешь, какие значение передаёт серверу ClientDataSet? И зачем он ваще нужен это ClientDataSet? 

Ну, он нужен для работы согласно http://edn.embarcadero.com/article/40521 видео.

Автор: Akella 15.4.2010, 21:39
не знаю... я бы на твоём месте не использовал dbExpress, есть другие замечательные компоненты

Автор: Keeper89 15.4.2010, 22:09
Цитата(Akella @  15.4.2010,  21:39 Найти цитируемый пост)
не знаю... я бы на твоём месте не использовал dbExpress, есть другие замечательные компоненты 

IBX? И чем так плох dbExpress?

Автор: Akella 16.4.2010, 00:29
Цитата(Keeper89 @  15.4.2010,  22:09 Найти цитируемый пост)
IBX?

Ну хотябы... хотя есть другие: anyDAC, FreeDAC, FibPlus, ZEOS, InterBase Objects (IBO), UnifiedIB (UIB), IBDac, FBLib, 

вот ещё
http://www.ibase.ru/components.htm


Цитата(Keeper89 @  15.4.2010,  22:09 Найти цитируемый пост)
И чем так плох dbExpress?

1. Я не говорю, что плох.
2. Я не понимаю, зачем такую большую цепочку использовать? Ведь это сказывается на производительности, отладке и простоте разработки.
3. "Родные" компоненты прямого доступа всё же лучше,  чем какое-то универсальное решение.

Добавлено через 1 минуту и 12 секунд
Лучше 1 раз купить фибы и потом горя не знать, ПМСМ.

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