C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C# SQLite 画像


(過去ログ 135 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■79768 / inTopicNo.1)  C# SQLite 画像
  
□投稿者/ うどん (1回)-(2016/05/13(Fri) 17:37:19)

分類:[C#] 

2016/05/13(Fri) 17:47:24 編集(投稿者)





C#初心者です、
C#でSQLiteを使って画像を保存し読み込みして表示したいです、

挿入はSQLiteにblob型テーブル作成し、そこにpictureBoxの画像をそのまま入れると
DBではSystem.Drawing.Bitmapと表示されます。
挿入した画像を読み込み表示がうまくできません。

コードです
***************************************************************************************************
// データベース接続
SQLiteConnection connection = new SQLiteConnection("DATA Source=データベース名.db");

// テーブル作成
connection.Open();
SQLiteCommand command = connection.CreateCommand();
command.CommandText = "create table " + テーブル名 + "(id INTEGER , img BLOB)";
command.ExecuteNonQuery();
connection.Close();

//データ挿入
connection.Open();
SQLiteCommand command = connection.CreateCommand();
command.CommandText =
"insert into " + テーブル名 + " (id,img) values('" + id + "', '" + 画像(pictureBoxの画像) + "')";
command.ExecuteNonQuery();
connection.Close();

ここが問題です
//取り出し
connection.Open();
SQLiteCommand command = connection.CreateCommand();
command.CommandText = "SELECT * from テーブル名";
SQLiteDataReader reader = command.ExecuteReader();
// ループ文
while (reader.Read())
{
// id
int id = Convert.ToInt32(reader["id"].ToString());

// 画像 
MemoryStream streamImage = new MemoryStream(reader["img"] as byte[]); 
pictureBox2.Image = Image.FromStream(streamImage); // ここでエラーになります。

streamImage.Close();
}

connection.Close();
**********************************************************************************************************

他にためした方法は画像をbyte[]に変換しそれをDBにいれるなどしてますが、やはり
画像を引き出すことはできませんでした。
DBからオブジェクト型しか返ってこないのでそれをうまく型変換できないです。

何かいい方法ありますか?
よろしくお願いします。

引用返信 編集キー/
■79769 / inTopicNo.2)  Re[1]: C# SQLite 画像
□投稿者/ とっちゃん (357回)-(2016/05/13(Fri) 18:34:33)
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 );

としてみてください。この形なら、どこでおかしいかなどステップが分解されるのでエラーの把握がしやすくなると思います。

引用返信 編集キー/
■79785 / inTopicNo.3)  Re[2]: C# SQLite 画像
□投稿者/ うどん (2回)-(2016/05/16(Mon) 09:47:19)

ありがとうございます。

解決しました、
データがちゃんとBLOB型になって引き出す事ができました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -