IBProvider 3.16. Новые возможности для SQL и 64-битной платформы
В новой версии провайдера:
- Поддержка «RETURNING … INTO …» в запросах
- IN-OUT параметры в запросах «exec SP <param list>» и «{call SP(<param_list>)}»
- Прозрачная поддержка 32-битных и 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
Вывод:

Вы можете использовать одно имя для 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
Вывод:

Кроме того, Вы можете использовать в секции 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
Вывод:

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
Вывод:

Прозрачная поддержка 32-битных и 64-битных приложений
В текущую версию провайдера были добавлены два новых свойства инициализации: dbclient_library_64 и icu_library_64. Теперь Вы можете в одной строке подключения указать параметры как для 32-битного, так и для 64-битного приложения.
Исправлены критические ошибки
Выявлены и исправлены критические ошибки, которые могут возникать при исчерпании доступной памяти процесса. Создан изолированный тест для демонстрации проблемы – «TestCode\ActiveX\IBP\stress_tests\00001__open_rowset_no_vmem».
Специальное предложение
У нас хорошее настроение – IBProvider v3 преодолел очередную отметку своего технологического развития и качества.
Но мы не будем тратить наше время на инкремент номера основной версии до v4. Нет.
Нам нравится эта сигнатура — v3. И у нас есть еще много интересных и сложных идей для v3.
Плюс – у нас есть все для их реализации: желание, знания, отличная кодовая база, автоматические тесты и оборудование.
Поэтому мы предлагаем Вам не тратить Ваше время на поиски в неизвестных направлениях и тестирование продуктов с неизвестным будущим.
