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