| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Delphi 2010 & Firebird 2.1 |
| Автор: Keeper89 5.4.2010, 09:17 |
| Доброго времени суток. Есть ли у кого материалы по сабжу? 1) В чем лучше (визуальное средство) проектировать, изменять БД Firebird? 2) Как работать с Firebird'ом в Delphi через dbExpress (может есть примеры)? Заранее спасибо. |
| Автор: Alexeis 5.4.2010, 12:53 |
Использую их. БД в формате UTF8 постоянно имею проблемы с преобразованием типов строк. Все они безусловно решаются положительно, но писать такой код неудобно, чуть забыл написать преобразование и выползли кракозяблы. Смотрел код FIBPlus. Они заметно лучше, но стоят денег. Так что это вопрос нужно оно вам настолько что вы готовы за это платить. |
| Автор: ReptileDB 6.4.2010, 12:44 |
| Сейчас пишу софт с использованием Delphi 2010 & Firebird 2.1, но из dbExpress использую только SQLConnection, а вот от остальных компонент отказался по причине того, что тупо не отлавливает Exceptions которые я специально генерирую в хранимых процедурах. |
| Автор: Akella 6.4.2010, 16:25 | ||||
А в стандартной поставке примеров нет? Добавлено через 1 минуту и 25 секунд
А в параметрах соединение ставишь UTF-8 и всё равно кракозябры? |
| Автор: Alexeis 6.4.2010, 16:49 |
А с чего вдруг у меня должны быть не кракозяблы если результат всегда приходит в UTF8, а компоненты не позволяют получать результат AsUTF8String ? Результат приходит совершенно правильный. Есть 2 варианта AsWideString и AsAnsiString. И то и другое не соответствует нативному типу. Сам движок не знает что тип строки это UTF8 обернутый в AnsiString. Скажем так, в байтовом представлении приходит верный результат, если бы он сам знал что в варианте у него фактически UTF8, то все строковые преобразования работали по присваиванию. Но исходники IBX таковы что установка режима UTF8 ничего внутри него не меняет кроме состояния поля объекта. Т.е. можно прочитать поле объекта и узнать что тип соединения UTF8, но сам IBX проинтерпретирует полученную строку как AnsiString. |
| Автор: Keeper89 9.4.2010, 15:43 | ||
А что если работать через SQLConnection -> SQLDataSet/SQLQuery -> DataSetProvider -> ClientDataSet -> DataSource ? |
| Автор: Akella 9.4.2010, 20:27 |
| Keeper89, давай ещё цепочку продолжим тремя-четырьмя компонентами, а? А то что-то короткая цепочка |
| Автор: Keeper89 10.4.2010, 00:11 |
| Akella, дальше некуда ) |
| Автор: Keeper89 11.4.2010, 00:45 |
| Расположил на форме все вышеуказанное + пару DBEdit'ов и DBNavigator. После добавления записи с помощью последнего, на форме запись имеется, но в самой базе ее нет. Что я делаю не так? |
| Автор: Данкинг 11.4.2010, 00:53 | ||
Я с DBNavigator не работал, поэтому за него не скажу, но замечу, что при добавлении записей надо не забывать подтверждать транзакцию:
|
| Автор: Keeper89 11.4.2010, 23:18 | ||
Не ну понятное дело, что нужно делать
но вот в какой момент... |
| Автор: VahaC 12.4.2010, 00:55 | ||||||
Keeper89,
и
немного разные вещи |
| Автор: 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 | ||
DBNavigator тут не причем. Подтверждать транзакцию нужно в ClientDataSet, в триггере AfterPost. Ну и, соответственно, выполнять откат при ошибке (OnPostError и т.п.). |
| Автор: VahaC 12.4.2010, 11:14 | ||
полностью согласен |
| Автор: Keeper89 12.4.2010, 12:30 | ||
ок, а как это должно выглядеть в коде? |
| Автор: former 12.4.2010, 12:42 | ||
|
| Автор: Keeper89 12.4.2010, 12:46 |
| А что есть IBTransaction1? + другой маленький вопрос (не буду делать отдельную тему). Имеется триггер (и соотв. генератор) на BeforeInsert для ID-поля. При вставке новой записи в IBExpert'е автоматически добавляется новый ID как и положено, однако при попытке добавления записи в Delphi такого не происходит. В чем может быть дело? |
| Автор: former 12.4.2010, 13:15 |
Так ты используешь dbExpress. А я так понял, что после сообщения Данкинг-а IBX. Вот http://www.sql.ru/Forum/actualthread.aspx?bid=2&tid=502943&hl=. Тело триггера в студию. |
| Автор: Данкинг 12.4.2010, 14:41 | ||
А, ну да, я про IBX, разумеется. Там без IBTransaction работать и не будет. |
| Автор: Keeper89 12.4.2010, 15:29 | ||
Очень она пессимистичная В моем случае никак?
|
| Автор: Akella 12.4.2010, 15:32 |
Это транзакция. Транзакции в базах данных ухх как важны! http://kenal.info/baset5r3part1.html |
| Автор: Keeper89 12.4.2010, 15:38 | ||
Спасибо за напоминание |
| Автор: Akella 12.4.2010, 15:55 | ||||||
А что ты передаёшь серверу, NULL? Согласно условий ты должен передать NULL в запросе для этого поля. А лучше вообще не передавать это поле:
Добавлено @ 15:56 Или если НЕ передаёшь NULL, то должен передать конкретное значение:
|
| Автор: Keeper89 12.4.2010, 20:01 |
Ничего не передаю. У меня есть ClientDataSet, для добавления я делаю ClientDataSet.Insert, заполняю только нужные поля (через DBEdit'ы), и дальше ClientDataSet.Post. |
| Автор: Akella 13.4.2010, 10:41 | ||
Хорошо. А что значит "ничего не происходит"? Что ты под этим подразумеваешь? Что ты ожидаешь? Что должно произойти? |
| Автор: Keeper89 13.4.2010, 11:55 | ||
Я подразумеваю, что при Post'е незаполненные поля (которые по идее передаются как NULL) заполнятся автоматически на основании триггеров. А выдается ошибка, что поле должно быть заполнено. |
| Автор: Akella 14.4.2010, 09:05 |
| Наверное, это связано с внутренней реализацией компонент. Поэтому два выхода. 1. В клиентской части приложения берём значение генератора и передаём в запросе, как и все остальные поля. 2. Поле ID вообще не должно участвовать в запросе. Зачем ты его туда пхаешь? |
| Автор: former 14.4.2010, 09:30 |
| Keeper89, выложи пример того, что ты делаешь. Тяжело гадать на кофейной гуще. |
| Автор: Keeper89 15.4.2010, 02:46 | ||
Я его не трогаю, просто при Insert'е он добавляет все поля, и это тоже. |
| Автор: Akella 15.4.2010, 12:41 | ||
| 1. Кто "он"? И куда добавляет? В SQL запрос? 2. вот же пример
вставь его в кверю и выполни... как видишь, здесь нет поля ID |
| Автор: Keeper89 15.4.2010, 13:23 |
ClientDataSet через Insert и Post. попробую |
| Автор: Akella 15.4.2010, 16:12 |
А откуда ты знаешь, какие значение передаёт серверу ClientDataSet? И зачем он ваще нужен это ClientDataSet? |
| Автор: Keeper89 15.4.2010, 21:14 | ||
Ну, он нужен для работы согласно http://edn.embarcadero.com/article/40521 видео. |
| Автор: Akella 15.4.2010, 21:39 |
| не знаю... я бы на твоём месте не использовал dbExpress, есть другие замечательные компоненты |
| Автор: Keeper89 15.4.2010, 22:09 | ||
IBX? И чем так плох dbExpress? |
| Автор: Akella 16.4.2010, 00:29 |
Ну хотябы... хотя есть другие: anyDAC, FreeDAC, FibPlus, ZEOS, InterBase Objects (IBO), UnifiedIB (UIB), IBDac, FBLib, вот ещё http://www.ibase.ru/components.htm 1. Я не говорю, что плох. 2. Я не понимаю, зачем такую большую цепочку использовать? Ведь это сказывается на производительности, отладке и простоте разработки. 3. "Родные" компоненты прямого доступа всё же лучше, чем какое-то универсальное решение. Добавлено через 1 минуту и 12 секунд Лучше 1 раз купить фибы и потом горя не знать, ПМСМ. |