Дата публикации: 06.06.2013
Использование OleDbDataReader.GetChars (C#)
//////////////////////////////////////////////////////////////////////////////// //Samples for LCPI ADO.NET Data provider for OLEDB. // 06.06.2013 using System; using System.Diagnostics; using System.Data; using lcpi.data.oledb; namespace Sample_0008{ //////////////////////////////////////////////////////////////////////////////// //class Program class Program { //Note. // We use a NONE connection charset // - This is allow IBProvider to work with original charset of // columns and parameters. Required Firebird 2.5+. private const string c_cn_str ="provider=LCPI.IBProvider.3;" +"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;" +"ctype=NONE;" +"user id=gamer;" +"password=vermut;"; static int Main(string[] args) { int resultCode=0; try { const int c_min_text_size=8*1024*1024+1;//8MB+1 chars const int c_block_size=64*1024; //64K const string c_template_str ="(russian text (win1251). hello all!) русский текст (win1251). всем привет!"; //--------------------------------------- build test string var sb=new System.Text.StringBuilder(c_min_text_size+c_template_str.Length); while(sb.Length<c_min_text_size) sb.Append(c_template_str); var test_str=sb.ToString(); //--------------------------------------- connect to database Console.WriteLine("Connect to database ..."); var cn=new OleDbConnection(c_cn_str); cn.Open(); //----- Console.WriteLine("Start transaction ..."); var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead); //--------------------------------------- insert test string to UTF8 blob Console.WriteLine("Create and prepare insert command ..."); var cmd=new OleDbCommand("",cn,tr); cmd.CommandText="insert into TBL_CS__UTF8 (COL_BLOB) values(:blob)\n" +"returning TEST_ID\n" +"into :id"; cmd["blob"].Value=test_str; //---- Console.WriteLine("Insert test record ..."); cmd.ExecuteNonQuery(); var rec_id=cmd["id"].Value; Console.WriteLine("Test record ID: {0}",rec_id); //--------------------------------------- select test record Console.WriteLine("Prepare select command ..."); cmd.CommandText="select COL_BLOB from TBL_CS__UTF8 where TEST_ID=:x"; cmd["x"].Value=rec_id; //---- Console.WriteLine("Select test record ..."); var reader=cmd.ExecuteReader(); if(!reader.Read()) throw new ApplicationException("Test record not found!"); if(reader.IsDBNull(0)) throw new ApplicationException("Select NULL value!"); //---- detect blob length long column_data_length=reader.GetChars(/*COL_BLOB*/0,0,null,0,0); Console.WriteLine("BLOB length: {0}",column_data_length); if(column_data_length!=test_str.Length) { ++resultCode; Console.WriteLine("ERROR: Get wrong blob length: {0}. Expected: {1}.", column_data_length, test_str.Length); }//if //---- read blob data Console.WriteLine("Check BLOB data ..."); var buf=new char[c_block_size]; long dataOffset=0; long nBlocks=0; for(;;) { long l=reader.GetChars(/*COL_BLOB*/0,dataOffset,buf,0,buf.Length); Debug.Assert(l>=0); Debug.Assert(l<=buf.Length); if(l==0) break; //no more data ++nBlocks; for(int i=0;i!=l;++i,++dataOffset) { if(dataOffset==test_str.Length) throw new ApplicationException("Wrong blob data [check point #1]"); if(buf[i]!=test_str[(int)dataOffset]) throw new ApplicationException("Wrong blob data [check point #2]"); }//for i, dataOffset }//for[ever] Debug.Assert(dataOffset<=test_str.Length); if(dataOffset!=test_str.Length) throw new ApplicationException("Wrong blob data [check point #3]"); Console.WriteLine("OK. Block count: {0}",nBlocks); //--------------------------------------- Console.WriteLine("Commit transaction ..."); tr.Commit(); } catch(Exception e) { ++resultCode; Console.WriteLine(""); Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message); }//catch return resultCode; }//Main };//class Program //////////////////////////////////////////////////////////////////////////////// }//namespace Sample_0008