SQLite3 ADO.NET C# BLOBデータの読み書き | カルメン日記

SQLite3 ADO.NET C# BLOBデータの読み書き

thanks Peter A. Bromberg, Ph.D.


Write BLOB データ

private void setBLOBData()
{
	// データの読み込み(using System.IO;を追加)
	FileStream fs = new FileStream(@"E:\sampleIn.jpg", FileMode.OpenOrCreate, FileAccess.Read);
	byte[] MyData= new byte[fs.Length];
	fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));
	fs.Close();

	// データベースの接続
	IDbConnection conn = new SQLiteConnection();
	string logPath = @"E:\" + @"log.db";
	conn.ConnectionString = "Data Source=" + logPath + ";New=False;Compress=False;Synchronous=Off;UTF8Encoding=True;Version=3";

	conn.Open();
	if (conn.State != ConnectionState.Open)
		return;

	IDbCommand cmd = conn.CreateCommand(); // Command オブジェクトを作成
	cmd.CommandText = "insert into mytable values (?, ?, ?, ?)";
	((SQLiteCommand) cmd).CreateAndAddUnnamedParameters();

	IDbTransaction trans = conn.BeginTransaction(); // トランザクション開始
	((IDataParameter) cmd.Parameters[0]).Value = "AaBbCc123"; // 文字列
	((IDataParameter) cmd.Parameters[1]).Value = 123;
	((IDataParameter) cmd.Parameters[2]).Value = 123.54; // NUMERIC
	((IDataParameter) cmd.Parameters[3]).Value = MyData; // BLOB
	((IDataParameter) cmd.Parameters[3]).DbType = DbType.Binary;	// DBTypeを指定(重要)

	cmd.ExecuteNonQuery(); // 実行
	trans.Commit(); // トランザクション終了
}

Read BLOB データ

private void getBLOBData()
{
	// データベースの接続
	IDbConnection conn = new SQLiteConnection();
	string logPath = @"E:\" + @"log.db";
	conn.ConnectionString = "Data Source=" + logPath + ";New=False;Compress=False;Synchronous=Off;UTF8Encoding=True;Version=3";

	conn.Open();
	if (conn.State != ConnectionState.Open)
		return;

	// データアダプタの作成
	SQLiteDataAdapter da = new SQLiteDataAdapter("select * From mytable ", conn);
	SQLiteCommandBuilder MyCB = new SQLiteCommandBuilder(da);
	DataSet ds = new DataSet("blobData");
	da.Fill(ds, "blobData");
	conn.Close();
	DataRow myRow;
	// 最新のRowを取得
	myRow=ds.Tables["blobData"].Rows[ds.Tables["blobData"].Rows.Count-1 ];     
	// blob列をArrayにコピー
	byte[] stuff=( byte[])myRow["blob"];
	// Arrayサイズを取得
	int ArraySize = new int();
	ArraySize = stuff.GetUpperBound(0);

	// データの書き込み(using System.IO;を追加)
	FileStream fs = new FileStream(@"E:\sampleOut.jpg", FileMode.OpenOrCreate, FileAccess.Write);
	fs.Write(stuff, 0,ArraySize);
	fs.Close();
}