Отмена выполнения запросов и поддержка нового типа данных Firebird v2.5 — SQL_NULL
Поддержка отмены команд в Firebird 2.5 и в InterBase 6.5
В новой версии IBProvider реализована возможность отмены выполнения команд. Сам запрос и операция по отмене должны выполняться в разных потоках.
Минимальные требования: Серверная и клиентская часть InterBase 6.5 или новее, Firebird 2.5 или новее.
Тестовый пример на C#:
Перед выполнением примера необходимо выполнить следующий DDL запрос:
CREATE OR ALTER PROCEDURE SP_EXEC_DUMMY_COUNTER (n integer) AS BEGIN WHILE(N>0)DO BEGIN N=N-1; END END
Код примера:
[Test(Description = "Sample - Command.Cancel")] public void CancelCommand() { using (OleDbConnection con = ConnectionProvider.CreateConnection()) { con.Open(); OleDbTransaction trans = con.BeginTransaction(); cmd.CommandText = "exec SP_EXEC_DUMMY_COUNTER(5000000)"; // call cmd.ExecuteScalar using BackgroundWorker class BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += delegate(object sender, DoWorkEventArgs e) { OleDbCommand cmd1 = e.Argument as OleDbCommand; Console.WriteLine("begin call"); cmd1.ExecuteScalar(); Console.WriteLine("end call"); }; bw.RunWorkerAsync(cmd); //Cancel command after 500 miliseconds System.Threading.Thread.Sleep(500); cmd.Cancel(); // waiting while cancel perform while (bw.IsBusy) { System.Threading.Thread.Sleep(500); } trans.Commit(); } }
Поддержка нового типа данных Firebird 2.5 — SQL_NULL
В Firebird 2.5 появилась возможность выполнять запросы с выражениями вида «? is NULL». Для этого используется новый тип данных — SQL_NULL. IBProvider умеет обрабатывать SQL_NULL для именованных и позиционных параметров.
Пример:
select count(*) from PROJECT where :par_null is NULL
Если значение параметра par_null будет NULL, условие WHERE будет верно и команда вернет количество записей в таблице PROJECT, иначе команда вернет 0. Далее приведен полный текст примера на VBScript:
dim cn, cmd, rs set cn = wscript.createobject("adodb.connection") call cn.open("Provider=LCPI.IBProvider.3;Password=masterkey;" & _ "Persist Security Info=True;User ID=sysdba; " & _ "Location=localhost:EMPLOYEE.FDB; dbclient_library=fbclient.dll") cn.BeginTrans WScript.Echo "IB Base=" & cn.Properties("IB Base").Value WScript.Echo "IB Client Version=" & cn.Properties("IB Client Version").Value WScript.Echo "Provider Version =" & cn.Properties("Provider Version").Value set cmd = WScript.Createobject("adodb.command") cmd.activeconnection = cn cmd.CommandText = "select count(*) from PROJECT where :par_null is NULL" cmd("par_null").Value = null set rs=cmd.Execute WScript.Echo cstr(rs(0)) cn.CommitTrans cn.Close
Тот же пример на C#:
[Test(Description = "Sample - 'is NULL' operator")] public void ExecIsNullCommand() { using (OleDbConnection con = ConnectionProvider.CreateConnection()) { con.Open(); OleDbTransaction trans = con.BeginTransaction(); OleDbCommand cmd = new OleDbCommand("select (*) from PROJECT where ? is NULL", con, trans); cmd.Parameters.AddWithValue("", null); // if cmd parameter is null then command will return count result Assert.IsTrue((int)cmd.ExecuteScalar() > 0); trans.Commit(); } }
Минимальные требования: Серверная и клиентская часть не ниже Firebird 2.5 Beta 1.
Исправлена ошибка при работе с BLOB-полями через ADOExpress (dbGo)
В предыдущих версиях IBProvider, при работе с BLOB-полями через ADOExpress (dbGo) могла возникать ошибка Write BLOB: User storage-object works incorrectly. Подробная информация в этом топике: IB-native IN-parameter value create failed.
Новая реализация кеша результирующих множеств
- Реализована асинхронная запись (в отдельном потоке) в собственный файл подкачки.
- Оптимизирована запись во временный файл.
В заключении
Наряду с реализацией поддержки новых возможностей Firebird 2.5, мы постоянно работаем над улучшением ядра IBProvider, реализуем новые сервисы, которые позволяют сохранять гибкость и масштабируемость драйвера при наращивании его функциональности.