Дата публикации: 11.06.2009

Отмена выполнения запросов и поддержка нового типа данных 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, реализуем новые сервисы, которые позволяют сохранять гибкость и масштабируемость драйвера при наращивании его функциональности.


Дата публикации: 11.06.2009. Права на материал принадлежат: IBProvider. При перепечатке ссылка на сайт https://www.ibprovider.com/rus обязательна.