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

IBProvider 3.12. Новые возможности для именованных параметров и вложенных транзакций

Поддержка именованных параметров.

Добавлено новое свойство инициализации источника данных и команды – «named_param_rules». Пример использования:

//Use
// - Firebird SQL Server v2.5.2
// - LCPI.IBProvider v3.12
// - LCPI ADO.NET Data Provider for OLE DB
using System;
using System.Data;

using xdb=lcpi.data.oledb;

namespace ConsoleApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   try
   {
    const string c_cn_str
     ="provider=LCPI.IBProvider.3;"
     +"location=localhost:d:\\database\\employee.fdb;"
     +"user id=SYSDBA;"
     +"password=masterkey;"
     +"named_param_prefix=@;"
     +"named_param_rules=1";

    using(var cn=new xdb.OleDbConnection(c_cn_str))
    {
     cn.Open();

     using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead))
     {
      var cmd=new xdb.OleDbCommand("select * from employee where first_name=@name",cn,tr);

      //use an explicit definition
      cmd.Parameters.AddWithValue("@name","Roger");

      //small optimization through hint "SingleResult"
      using(var reader=cmd.ExecuteReader(CommandBehavior.SingleResult))
      {
       //Test result set. We get false for empty result set. Really.
       if(reader.HasRows)
       {
        //reuse the command for update query
        cmd.CommandText="update employee set first_name=upper(first_name)\n"
                       +"where emp_no=@emp_id\n"
                       +"returning old.first_name";

        //ask provider to generate the parameters list
        cmd.Parameters.Refresh();

        for(int n=1;reader.Read();++n)
        {
         cmd["@emp_id"].Value=reader["emp_no"];

         cmd.ExecuteNonQuery();

         Console.WriteLine("{0}. Update emp_no: {1}. Old first_name: \"{2}\"",
                           n,
                           reader["emp_no"],
                           cmd["@first_name"].Value);
        }//while reader
       }//if HasRows
      }//using reader
     }//using tr
    }//using cn
   }
   catch(Exception e)
   {
    Console.WriteLine("ERROR: {0} - {1}",
                      e.Source,
                      e.Message);
   }//catch
  }//Main
 }//class Program
}//namespace ConsoleApplication

Вложенные транзакции.

По-умолчанию, новый IBProvider запрещает коммит транзакции, если она содержит активные вложенные транзакции. Кроме того, новый провайдер, по-умолчанию, запрещает освобождение точки сохранения, если эта точка сохранения содержит активные вложенные транзакции. Новое свойство инициализации источника данных «nested_trans_rules» позволяет настраивать это новое поведение. Пример нового поведения IBProvider-a:

option explicit

rem Use
rem - Firebird SQL Server v2.5.2
rem - LCPI.IBProvider v3.12

dim cn
set cn=createobject("ADODB.Connection")

cn.Provider="LCPI.IBProvider.3"

call cn.Open("location=localhost:d:\database\employee.fdb;" _
             +"nested_trans=true", _
             "gamer", _
             "vermut")

call cn.BeginTrans() 'level 1
call cn.BeginTrans() 'level 2

dim tr1
set tr1=createobject("LCPI.IBP.Samples.TransactionLevel.1")

call tr1.Attach(cn,1)

on error resume next

'error
call tr1.Commit(false)

wscript.echo "["&err.Source&"]"&vbCrLf&err.Description

Вывод:

Output of sample #2.

Другие изменения.

  • Исправление ошибок: утечка памяти, MT-ошибка, ошибки в работе с DTC и другое.
  • Улучшена обработка ошибок.
  • Оптимизация.

Тесты.

  • Новая сборка была протестирована с InterBase (4.0-10.0.4) и Firebird (0.9.4-3.0).
  • Выполнено нагрузочное тестирование с Firebird 2.5.2.

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