Решил опять напомнить о себе, может кому ещё окажется полезным. Продолжаю модифицировать компоненты IBX:
версия 2.0Изменения в организации доступа к API FireBird. В предыдущей версии, независимо от того какое количество компонентов
TIBDataBase используется в программе, существовал единый метод загрузки клиентской библиотеки, а это значит, что
работа из программы была возможна только с серверами одной и той же версии, нельзя было загрузить 2 разные
клиентские библиотеки. Работа с компонентами была возможна, только если предварительно удалось загрузить клиентскую
библиотеку. В версии 2.0 каждый компонент TIBDatabase получил персональный механизм манипулирования и доступа к
клиентской библиотеке, загрузка библиотеки происходит при установлении соединения с базой, при разрыве соединения,
библиотека освобождается.
В компонент TIBDatabase добавлено свойство LibraryName - в котором указывается имя библиотеки. Поиск и загрузка
библиотеки происходит исключительно по указанному имени. Имя может быть указано с полным путем и без. Если
путь не указан, поиск библиотеки происходит в папке с выполняемой программой. В свойстве LibraryName
по умолчанию присутствует строка: Для windows - 'fbclient.dll', для Linux - 'fbclient.so'.
Переделан метод получения значения генератора в TIBGenerator. Добавлено свойство GenerateFor_0: Boolean по умолчанию
True. Это позволяет генерить значение не только когда в поле пусто, но и когда там 0.
Полный список изменений:
Добавлена работа компонент в рамках 2х транзакций (одна "читающая", вторая "пишущая" для обновляющих запросов Insert, Update, Delete).
Добавлены свойства:
AutoStartTransaction, AutoCommit - управление поведением транзакций (об этом подробнее ниже).
AutoParamToField - Если есть параметры, имена которых совпадают с именами полей, при вставке новой записи, значение параметров автоматом подставляются в соответствующие поля.
AutoTrim - автотримирование строк.
AutoFetchAll - если True, то автоматически выполняет FetchAll после каждого открытия набора данных.
DefFormats - задает форматы отображения и редактирования Numeric и DateTime полей.
EditFormats - позволяет задать собственные форматы редактирования конкретных полей.
FieldsFormats - позволяет задать собственные форматы отображения конкретных полей.
RetFields - включает поддержку возвращаемых полей (RETURNING FIELDS) и возвращаемых значений из EXECUTE PROCEDURE и EXECUTE BLOCK
Добавлен метод FullRefresh.
Добавлена поддержка выражений EXECUTE BLOCK
Добавлена возможность сортировки данных (public свойство OrderFields). Сортировка выполняется не в локальном буфере, а парсится Select запрос,
в который добавляется или изменяется инструкция Order By и запрос переоткрывается.
Изменена организация доступа к API клиентской библиотеки FireBird, у каждого TIBDataBase свой собственный, независимый механизм. Загрузка
библиотеки происходит при подключении к базе и освобождается при разрыве соединения.
Работа свойств AutoStartTransacton и AutoCommit:
Пример 1.
AutoStartTransaction = True и AutoCommit = True и перед выполнением запроса из QSelect Transaction.InTransaction = False то:
Транзакция для QSelect запускается автоматически, после завершения запроса - Commit автоматом. Запросы из QInsert, QModify и QDelete тоже стартуют и завершают "пишущую" UpdateTransaction автоматически.
Пример 2.
AutoStartTransaction = True и AutoCommit = True и перед выполнением запроса из QSelect Transaction.InTransaction = True то:
Транзакция для QSelect уже запущена, после выполнения запроса - Commit не произойдет, т.к. на момент старта запроса, транзакция уже была активна (Т.е. AutoCommit здесь сработает только если читающий запрос запустил для себя транзакцию автоматом). Запросы из QInsert, QModify и QDelete стартуют и завершают "пишущую" UpdateTransaction автоматически.
Пример 3.
AutoStartTransaction = False. AuteCommit = True. Автостарта для "пишущей" и "читающей" транзакции не будет, нужно запускать руками. Читающую транзакцию завершать тоже придется руками. А у "пишущей" commit сработает автоматом.
Пример 4.
AutоCommit = False. Завершаться транзакции, как бы они не были запущены нужно руками, авто завершения после выполнения запросов (и пишущих и читающих) не будет.
И ещё, в случае когда AutoCommit = False и после выполнения модифицирующего запроса требуется выполнить обновление текущей записи (запрос из QRefresh) он будет выполнен через
UpdateTransaction, т.е. если AutoCommit = False и QRefresh.Text <> '' то обновляющая транзакция должна быть не только пишущая, но и иметь параметры для возможности чтения.
По поводу правильного использования раздельных транзакций (какие параметры туда вписывать), смотрите здесь:
http://www.devrace.com/ru/fibplus/articles/2169.phpВзять можно здесь:
http://www.visual-t.ru