Дата публикации: 06.06.2013
Использование OleDbDataReader.GetBytes (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_0009{
////////////////////////////////////////////////////////////////////////////////
//class Program
class Program
{
private const string c_cn_str
="provider=LCPI.IBProvider.3;"
+"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;"
+"user id=gamer;"
+"password=vermut;";
//----------------------------------------------------------------------
private static byte GenByte(long i)
{
return (byte)(i%253);
}//GenByte
//----------------------------------------------------------------------
static int Main(string[] args)
{
int resultCode=0;
try
{
const int c_bytes_count=8*1024*1024+1;//8MB+1
const int c_block_size=64*1024; //64K
//--------------------------------------- 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 bytes to binary blob
Console.WriteLine("Create and prepare insert command ...");
var cmd=new OleDbCommand("",cn,tr);
cmd.CommandText="insert into TBL_CS__OCTETS (COL_BLOB) values(:blob)\n"
+"returning TEST_ID\n"
+"into :id";
{
var test_bytes=new byte[c_bytes_count];
for(int i=0;i!=c_bytes_count;++i)
test_bytes[i]=GenByte(i);
cmd["blob"].Value=test_bytes;
}//local
//----
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__OCTETS 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.GetBytes(/*COL_BLOB*/0,0,null,0,0);
Console.WriteLine("BLOB length: {0}",column_data_length);
if(column_data_length!=c_bytes_count)
{
++resultCode;
Console.WriteLine("ERROR: Get wrong blob length: {0}. Expected: {1}.",
column_data_length,
c_bytes_count);
}//if
//---- read blob data
Console.WriteLine("Check BLOB data ...");
var buf=new byte[c_block_size];
long dataOffset=0;
long nBlocks=0;
for(;;)
{
long l=reader.GetBytes(/*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==c_bytes_count)
throw new ApplicationException("Wrong blob data [check point #1]");
if(buf[i]!=GenByte(dataOffset))
throw new ApplicationException("Wrong blob data [check point #2]");
}//for i, dataOffset
}//for[ever]
Debug.Assert(dataOffset<=c_bytes_count);
if(dataOffset!=c_bytes_count)
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_0009
