バイナリデータの格納
MS-DOS時代は細かくディレクトリ分けしてファイル管理していたのですが、HDDの大容量化で空きを気にせず、どかどかデータを増やしていたら管理不能になり、現在はディレクトリ名を日付にして放り込んでいたりします。(^^; 以前から、DB管理出来たら便利そうな気がしているのですが、具体的にどうすればよいかアイディアがありません。まぁ、それでも日付ディレクトリよりはマシなので、実験的にDBを使ってみようかと思案中。
こんなテーブル作って、
create table files ( serno serial, name varchar(255) not null, path varchar(255), image longblob, create_date_time datetime not null, update_date_time datetime not null, access_date_time datetime not null, primary key (serno));
ドラッグ&ドロップでファイルをテーブルに格納させる。
private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { string files = e.Data.GetData(DataFormats.FileDrop) as string; if (files != null) { string sql = "insert into files values(null, ?name, ?path, ?image, ?create, ?update, ?access)"; string dbstr = ConfigurationSettings.AppSettings["ConnectionString"]; MySqlConnection conn = null; try { conn = new MySqlConnection(dbstr); conn.Open(); MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.Parameters.Add("?name", MySqlDbType.VarChar); cmd.Parameters.Add("?path", MySqlDbType.VarChar); cmd.Parameters.Add("?image", MySqlDbType.LongBlob); cmd.Parameters.Add("?create", MySqlDbType.Datetime); cmd.Parameters.Add("?update", MySqlDbType.Datetime); cmd.Parameters.Add("?access", MySqlDbType.Datetime); foreach (string file in files) { FileInfo fi = new FileInfo(file); cmd.Parameters["?name"].Value = fi.Name; cmd.Parameters["?path"].Value = fi.DirectoryName; cmd.Parameters["?create"].Value = fi.CreationTime; cmd.Parameters["?update"].Value = fi.LastWriteTime; cmd.Parameters["?access"].Value = fi.LastAccessTime; using (BinaryReader br = new BinaryReader(File.OpenRead(file))) { cmd.Parameters["?image"].Value = br.ReadBytes((int)br.BaseStream.Length); } cmd.ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (conn != null) { conn.Close(); conn = null; } } } }
ここまではサクサクいったんですが、大きなファイルを格納するとエラーが発生してしまい、2時間くらい悩む。で、
my.iniに
[mysqld] max_allowed_packet=8M
最大サイズ(例では8MB)を指定すれば良いことにやっと気づいた。(^^;