|
■No79768 (うどん さん) に返信
ソースコードを張り付けるときは、図表モードにすると、インデントが反映されますよ。
> //データ挿入 > connection.Open(); > SQLiteCommand command = connection.CreateCommand(); > command.CommandText = > "insert into " + テーブル名 + " (id,img) values('" + id + "', '" + 画像(pictureBoxの画像) + "')"; > command.ExecuteNonQuery(); > connection.Close();
この部分の、画像(pictureBoxの画像)はどんなデータですか? この形だと、idもimgも文字列データですよね?
非文字列形式のフィールドで格納する場合は command.CommandText = "INSERT INTO " + テーブル名 + "(id,img) VALUES (@id, @img)"; command.Parameters.Add( "id", System.Data.DbType.Int32 ); command.Parameters.Add( "img", System.Data.DbType.Binary ); command.Parameters["id"].Value = int.Parse(id); // 元々 int として設定したいなら、ちゃんとint 型 の id を用意すること。 command.Parameters["img"].Value = 画像(pictureBoxの画像)をバイト配列に直したもの;
というように、明示的に型を指定してパラメータ渡しする必要があります。 SQLite は、型指定してあっても実際のデータ設定時(INSERT UPDATE コマンドの実行)に 渡された実データの型で保存されます。
最初に提示した例だと、CommandText に与えているので、データは全部「文字列」で保存されています。 文字列で保存されているので、byte[] にキャストできないため、MemoryStream には null が渡されます。 null なので、0バイトのストリームデータを渡すことになるため、イメージファイルとしては読み込まれません。
上記のように、きちんと意図した型にして保存すれば、
受け取る場合は、object で帰ってくるので、必要に応じて「キャスト」します。
> // id > int id = Convert.ToInt32(reader["id"].ToString()); > > // 画像 > MemoryStream streamImage = new MemoryStream(reader["img"] as byte[]); > pictureBox2.Image = Image.FromStream(streamImage); // ここでエラーになります。
int id = reader["id"] as int; byte[] img = reader["img"] as byte[]; MemoryStream streamImage = new MemoryStream( img ); picgtureBox2.Image = Image.FromStream( streamImage );
としてみてください。この形なら、どこでおかしいかなどステップが分解されるのでエラーの把握がしやすくなると思います。
|