winformsを使用してdb内に画像を格納する

c# dapper sql-server winforms

質問

私はC#winformsとdapper micro ormを使ってSqlServerの中にImageを保存したい。

db内のPhotoフィールドはVARBINARY(MAX)タイプです

Bookのエンティティの中には、byte []型のPhotoプロパティがあります。

public Book 
{
   ... 
   public byte[] Photo { get; set; }
}

内部のwinformsウィンドウ

  OpenFileDialog open = new OpenFileDialog() { Filter = "Image Files(*.jpeg;*.bmp;*.png;*.jpg)|*.jpeg;*.bmp;*.png;*.jpg" };
   if (open.ShowDialog() == DialogResult.OK)
   {
       txtPhoto.Text = open.FileName;
   }

   string image = txtPhoto.Text;
   Bitmap bmp = new Bitmap(image);
   FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
   byte[] bimage = new byte[fs.Length];
   fs.Read(bimage, 0, Convert.ToInt32(fs.Length));
   fs.Close();

   byte[] Photo = bimage;

//私のリポジトリ内でオブジェクトを行に保存する際にエラーが発生するPhoto = @Photo

var sql = "UPDATE Book " +
          "SET Title = @Title, " +
          "    Language = @Language, " +
          ....
          "    Photo = @Photo" +
          "WHERE Id = @Id";

          this.db.Execute(sql, book); // error occures
          return book;

エラーは

'System.Data.SqlClient.SqlException'型の最初のチャンス例外がSystem.Data.dllで発生しました

追加情報: '写真'付近の構文が正しくありません。

何か不足していますか?

ありがとう

受け入れられた回答

WHEREキーワードの前に空白がありません:

      "    Photo = @Photo" + // no space at the end here
      "WHERE Id = @Id";      // and no space before WHERE here

また、SQLクエリテキストに複数行の文字列(つまり、 逐語文字リテラル )を使用することをお勧めします。

var sql = @"UPDATE Book 
            SET Title = @Title, 
                Language = @Language, 
                Photo = @Photo
            WHERE Id = @Id";

もう1つのことは、 Stream使用量usingブロックを使用しusingラップする方が良いことです(例外の場合にファイルハンドルを解放するため)。

byte[] photo;
using(var stream = File.OpenRead(txtPhoto.Text)
{
    photo = new byte[stream.Length];
    stream.Read(photo, 0, photo.Length);
}

// db query with dapper is OK


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ