Вести с полей. Запросы с «RETURNING INTO»
Привет всем.
Вчера выложили бинарники очередного релиза IBProvider’a — сборка 3.15.0.14897. С моей точки зрения в этом выпуске выправлена внутренняя архитектура провайдера и закрыты накопившиеся висяки в отношении пока еще не выпущенного Firebird 3. С пользовательской точки зрения это выглядит так.
Но, как говорится, это дела минувших дней. На повестке дня у нас реализация следующей моей давней идеи — явное указание имен для OUT-параметров в запросах вида «INSERT … RETURNING», «UPDATE .. RETURNING» и так далее.
Предлагаю не изобретать велосипед, а украсть позаимствовать синтаксис из PSQL — «… RETURNING … INTO …».
Выглядеть это будет приблизительно так:
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=gamer;"
+"password=vermut;";
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 NUM (N_4_0) values (4321)\n"
+"returning -TEST_ID, -N_4_0\n"
+"into :a, :b";
cmd.Parameters.Refresh();
var rows_affected=cmd.ExecuteNonQuery();
Console.WriteLine("RowsAffected: {0}",rows_affected);
Console.WriteLine("a: {0}",cmd["a"].Value);
Console.WriteLine("b: {0}",cmd["b"].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
На выходе получается что-то вроде:

Мне нравится. А остальным придется смириться 🙂
dimitr on 12 апреля, 2013
велосипед изобретаешь?
returning -TEST_ID as A, -N_4_0 as B