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

IBProvider 3.16. Новые возможности для SQL и 64-битной платформы

В новой версии провайдера:

А так же:

Поддержка «RETURNING … INTO …» в запросах

Теперь Вы можете явно определять имена OUT-параметров, возвращаемых запросами:

  • «INSERT … RETURNING …»
  • «UPDATE … RETURNING …»
  • «DELETE … RETURNING …»
  • «UPDATE OR INSERT … RETURNING …»
  • «MERGE INTO … RETURNING …» [FB3]

Все что Вам нужно сделать – добавить секцию «INTO» (как в PSQL) в подобные запросы. И Вы можете использовать Ваши имена для OUT-параметров в коде Вашего приложения.

using System;
using System.Data;
using xdb=lcpi.data.oledb;

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

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

     using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead))
     {
      using(var cmd=new xdb.OleDbCommand("",cn,tr))
      {
       cmd.CommandText
         ="insert into CUSTOMER (CUST_NO,CUSTOMER,COUNTRY)\n"
          +"values(NULL,'Yeti','Canada')\n"
          +"returning CUST_NO\n"
          +"into :ID";

       cmd.Parameters.Add("ID",xdb.OleDbType.BigInt,0,ParameterDirection.Output);

       var rows_affected=cmd.ExecuteNonQuery();

       Console.WriteLine("RowsAffected: {0}",rows_affected);

       Console.WriteLine("ID: {0}",cmd["ID"].Value);
      }//using cmd

      tr.Rollback();
     }//using tr
    }//using cn
   }
   catch(Exception exc)
   {
    Console.WriteLine("ERROR: [{0}] - {1}",exc.Source,exc.Message);
   }
  }//Main
 }//class Program
}//ConsoleApplication

Вывод:

Output of sample #1.

Вы можете использовать одно имя для IN и OUT параметров. В этом случае провайдер сформирует один IN-OUT параметр.

using(var cmd=new xdb.OleDbCommand("",cn,tr))
{
 cmd.CommandText
   ="insert into CUSTOMER (CUST_NO,CUSTOMER,COUNTRY)\n"
    +"values(:ID,'Yeti2','Canada')\n"
    +"returning CUST_NO,CUSTOMER\n"
    +"into :ID,:NAME";

 cmd["ID"].Value=DBNull.Value;

 Console.WriteLine("Execute command ...");
 var rows_affected=cmd.ExecuteNonQuery();

 Console.WriteLine("RowsAffected: {0}",rows_affected);

 Console.WriteLine("ID   : {0}",cmd["ID"].Value);
 Console.WriteLine("NAME : {0}",cmd["NAME"].Value);
}//using cmd

Вывод:

Output of sample #2.

Кроме того, Вы можете использовать в секции INTO неименованные параметры – «?».

using(var cmd=new xdb.OleDbCommand("",cn,tr))
{
 cmd.CommandText
   ="insert into CUSTOMER (CUST_NO,CUSTOMER,COUNTRY)\n"
    +"values(NULL,'Yeti3','Canada')\n"
    +"returning CUST_NO,CUSTOMER\n"
    +"into ?,?";

 cmd.Parameters.Refresh();

 Console.WriteLine("Execute command ...");
 var rows_affected=cmd.ExecuteNonQuery();

 Console.WriteLine("RowsAffected: {0}",rows_affected);

 Console.WriteLine("ID   : {0}",cmd[0].Value);
 Console.WriteLine("NAME : {0}",cmd[1].Value);
}//using cmd

Вывод:

Output of sample #3.

IN-OUT параметры в запросах «exec SP <param list>» и «{call SP(<param_list>)}»

Мы доработали реализацию вызовов хранимых процедур в стиле ADO.NET и ODBC. Теперь, если Вы используете одно и тоже имя для IN и OUT параметров, провайдер сформирует один IN-OUT параметр.

using System;
using System.Data;
using xdb=lcpi.data.oledb;

namespace ConsoleApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   const string c_cn_str
    ="provider=LCPI.IBProvider.3;"
    +"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;"
    +"user id=sysdba;"
    +"password=masterkey;"
    +"support_odbc_query=true";

   try
   {
    Console.WriteLine("Connect to database ...");
    using(var cn=new xdb.OleDbConnection(c_cn_str))
    {
     cn.Open();

     Console.WriteLine("Start transaction ...");
     using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead))
     {
      //CREATE PROCEDURE SP_INC_I4(IN_VALUE INTEGER)
      //RETURNS (OUT_VALUE INTEGER)
      //AS
      //BEGIN
      //OUT_VALUE=IN_VALUE+1;
      //END

      using(var cmd=new xdb.OleDbCommand("",cn,tr))
      {
       Console.WriteLine("Use ODBC call style ...");

       cmd.CommandText="{call SP_INC_I4(:x,:x)}";

       cmd["x"].Value=123;

       cmd.ExecuteNonQuery();

       Console.WriteLine("result: {0}",cmd["x"].Value);

       //-------
       Console.WriteLine("");
       Console.WriteLine("Use ADO.NET call style ...");

       cmd.CommandText="exec SP_INC_I4 :y,:y";

       cmd["y"].Value=321;

       cmd.ExecuteNonQuery();

       Console.WriteLine("result: {0}",cmd["y"].Value);
      }//using cmd

      tr.Rollback();
     }//using tr
    }//using cn
   }
   catch(Exception exc)
   {
    Console.WriteLine("ERROR: [{0}] - {1}",exc.Source,exc.Message);
   }
  }//Main
 }//class Program
}//ConsoleApplication

Вывод:

Output of sample #4.

Прозрачная поддержка 32-битных и 64-битных приложений

В текущую версию провайдера были добавлены два новых свойства инициализации: dbclient_library_64 и icu_library_64. Теперь Вы можете в одной строке подключения указать параметры как для 32-битного, так и для 64-битного приложения.

Исправлены критические ошибки

Выявлены и исправлены критические ошибки, которые могут возникать при исчерпании доступной памяти процесса. Создан изолированный тест для демонстрации проблемы – «TestCode\ActiveX\IBP\stress_tests\00001__open_rowset_no_vmem».

Настоятельно рекомендуется обновить Вашу копию IBProvider-а до текущей версии.

Специальное предложение

У нас хорошее настроение – IBProvider v3 преодолел очередную отметку своего технологического развития и качества. Но мы не будем тратить наше время на инкремент номера основной версии до v4. Нет. Нам нравится эта сигнатура — v3. И у нас есть еще много интересных и сложных идей для v3. Плюс – у нас есть все для их реализации: желание, знания, отличная кодовая база, автоматические тесты и оборудование.

Поэтому мы предлагаем Вам не тратить Ваше время на поиски в неизвестных направлениях и тестирование продуктов с неизвестным будущим.


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