Хотите задействовать выполнение SQL-скриптов в своих программах и тратить меньше времени на утомительное кодирование?
Хотите в одной команде создать таблицу, генератор, триггер, добавить данные в таблицу, сделать выборку и потом все это удалить? Теперь это возможно с новым IBProvider!
В новом IBProvider v.3.3.0.11117 реализована возможность выполнения команды с несколькими SQL-запросами (SQL-скрипты). Например:
set autoddl on; set transaction; create generator GEN_ID_TEST_TABLE; create table TEST_TABLE (ID INTEGER NOT NULL PRIMARY KEY,TEXT BLOB SUB_TYPE TEXT); create trigger BI_TEST_TABLE for TEST_TABLE before insert as begin if(NEW.ID IS NULL) then NEW.ID=GEN_ID(GEN_ID_TEST_TABLE,1); end; insert into TEST_TABLE (text) values('record 1'); insert into TEST_TABLE (text) values('record 2'); set term !!; select * from TEST_TABLE!! set terminator ;!! TEST_TABLE; set autoddl off; drop table TEST_TABLE; drop generator GEN_ID_TEST_TABLE; commit;
Добавлена поддержка специальных команд:
- SET {TERM|TERMINATOR} <new_stmt_terminator_string>. Добавлено для совместимости с ISQL. Новый терминатор действителен только в рамках текущего скрипта.
- SET AUTODDL {ON|OFF}. Если включено, то последующие DDL команды будут подтверждаться (commit) автоматически. Задаваемый режим действует только в рамках текущего скрипта. Если в скрипте отсутствует данная инструкция, то начальное состояние определяется значением свойства auto_commit_ddl.
Поддерживаются ли запросы, возвращающие данные клиенту?
Если в скрипте встречается запрос, возвращающий множество, то IBProvider осуществит закачку всех рядов (включая BLOB-поля и массивы) на клиента. В случае необходимости, для хранения больших множеств будут задействованы временные файлы. После завершения выполнения команды вы можете получить доступ к загруженным данным.
Что произойдет, если в скрипте встретятся несколько запросов, возвращающих данные?
Провайдер предоставляет возможность перебирать результаты выполнения каждого запроса.
При работе с Firebird/InterBase через ADODB для этого следует использовать методом Recordset.NextRecordset. Если запрос завершился по ошибке, то Recordset.NextRecordset выбросит исключение, которое можно перехватить и обработать. Если запрос не возвращает множество, то свойство Recordset.State будет равным нулю (adStateClosed). После перебора всех результатов, Recordset.NextRecordset вернет Nothing.
При работе с Firebird/InterBase через ADO.Net для загрузки данных из нескольких множеств следует воспользоваться методом OleDbDataAdater.Fill(dataset).
При работе с Firebird/InterBase через OLE DB интерфейсы, следует запросить результат работы команды в виде объекта с интерфейсом IMultipleResults.
Какие ограничения существуют на работу с SQL-скриптами?
На текущий момент, IBProvider нельзя задавать параметры команд для SQL-скриптов. Данная возможность появится в следующих выпусках.
Можно ли продолжить выполнение скрипта, если произошла ошибка в одном из запросов?
Да это возможно через свойство инициализации. По-умолчанию, если возникает ошибка, то IBProvider остановит выполнение команды. Это поведение можно изменить, установив новое свойство инициализации и команды multi_stmts_exec_rules равным 1. В этом случае провайдер сохранит описание ошибки и продолжит выполнение запросов.