Дата публикации: 17.10.2013
System.Data.OleDbDataAdapter и запрос «INSERT … RETURNING» (C#)
using System; using System.Data; using System.Data.OleDb; namespace Sample_0001{ //////////////////////////////////////////////////////////////////////////////// //class Program class Program { private const int c_nRows=5; private const string c_cn_str ="provider=LCPI.IBProvider.3;" +"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;" +"user id=gamer;" +"password=vermut;"; //Table: // TEST_SEQUENTIAL_MOVE // //Columns: // ID BIGINT [NOT NULL] [PRIMARY KEY] // //Triggers // BEFORE INSERT. IF NEW.ID is NULL THEN NEW.ID=GEN_ID(...,1); static int Main() { int resultCode=0; try // [catch] { OleDbConnection cn=null; OleDbTransaction tr=null; OleDbDataAdapter da=null; DataTable table=null; try // [finally] { cn=new OleDbConnection(c_cn_str); cn.Open(); //-------------------------------------- tr=cn.BeginTransaction(IsolationLevel.RepeatableRead); //-------------------------------------- create data_adapter da=new OleDbDataAdapter(); //-------------------------------------- prepare insert command //use explicit marker for OUT-parameter da.InsertCommand=new OleDbCommand("insert into TEST_SEQUENTIAL_MOVE (ID) values (?)\n" +"returning ID into ?", cn,tr); { var cmd_params=da.InsertCommand.Parameters; cmd_params.Add(Helper__CreateParam(ParameterDirection.Input, OleDbType.BigInt, "ID")); cmd_params.Add(Helper__CreateParam(ParameterDirection.Output, OleDbType.BigInt, "ID")); }//local //-------------------------------------- build table table=new DataTable(); table.Columns.Add("ID",typeof(Int64)); //-------------------------------------- fill table for(int i=0;i<c_nRows;++i) table.Rows.Add(table.NewRow()); Helper__PrintTable(table); //-------------------------------------- update Console.WriteLine(""); Console.WriteLine("Update"); da.Update(table); //-------------------------------------- Console.WriteLine(""); Helper__PrintTable(table); //-------------------------------------- commit tr.Commit(); } finally { Helper__Dispose(table); Helper__Dispose(da); Helper__Dispose(tr); Helper__Dispose(cn); }//finally } catch(Exception e) { resultCode=1; Console.WriteLine(""); Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message); }//catch return resultCode; }//Main //----------------------------------------------------------------------- private static void Helper__PrintTable(DataTable table) { for(int i=0,_c=table.Rows.Count;i!=_c;++i) { Console.WriteLine("Rows[{0}]={1} [{2}]", i, Helper__CStrNE(table.Rows[i][0]), table.Rows[i].RowState.ToString()); }//for i }//Helper__PrintTable //----------------------------------------------------------------------- private static OleDbParameter Helper__CreateParam(ParameterDirection direction, OleDbType type, string source) { var param=new OleDbParameter(); param.Direction =direction; param.OleDbType =type; param.SourceColumn=source; return param; }//Helper__CreateParam //----------------------------------------------------------------------- private static string Helper__CStrNE(object v) { if(Object.ReferenceEquals(v,null)) return "#NULL"; if(DBNull.Value.Equals(v)) return "#DBNULL"; return v.ToString(); }//Helper__CStrNE //----------------------------------------------------------------------- private static void Helper__Dispose(IDisposable obj) { if(!Object.ReferenceEquals(obj,null)) obj.Dispose(); }//Helper__Dispose //----------------------------------------------------------------------- private static void Helper__Dispose(OleDbDataAdapter da) { if(Object.ReferenceEquals(da,null)) return; Helper__Dispose(da.InsertCommand); da.Dispose(); }//Helper__Dispose };//class Program //////////////////////////////////////////////////////////////////////////////// }//namespace Sample_0001
Вывод.