2016-09-19 14 views
1

PictureBoxコントロールでビデオをストリームしていますが、PictureBoxから画像を取得してSQL Serverのテーブルに保存したいとします。 PictureBoxはストリームを表示しますが、PictureBoxはnullを取得します。PictureBoxコントロールのストリームからSQL Serverに画像を保存

どうしたのですか?

private void button1_Click(object sender, EventArgs e){ 
     SqlConnection con = new SqlConnection("Data Source=IBM-PC\\SQLEXPRESS2;Initial Catalog=DBACCESS;Integrated Security=True"); 

     if (cmrConductor.Image == null){ 
      mensajeOK("Error"); 
     }else{ 
      MemoryStream ms = new MemoryStream(); 
      cmrConductor.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
      byte[] Pic_arr = new byte[ms.Length]; 
      ms.Position = 0; 
      ms.Read(Pic_arr, 0, Pic_arr.Length); 

      SqlCommand cmd = new SqlCommand("INSERT INTO tblUsers (fldCode, fldPic) VALUES (@fldCode, @fldPic)", con); 
      cmd.Parameters.AddWithValue("@fldCode", txtId.Text); 
      cmd.Parameters.AddWithValue("@fldPic", Pic_arr); 
      con.Open(); 
      try{ 
       int res = cmd.ExecuteNonQuery(); 
       if (res > 0){ 
        MessageBox.Show("insert"); 
       } 
      } 
      catch (Exception ex){ 
       MessageBox.Show(ex.Message); 
      } 
      finally{ 
       con.Close(); 
      } 
     } 
    } 
+0

あなたの質問は完全ではありません。十分な詳細を持っていないので誰もが解決策を提示することはほとんど不可能です。トピックから少し外れていますが、AddWithValueについてこの記事を読むべきです。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –

+0

私はそれが説明するのが難しいことを知っています。実際は私は初心者の開発者です。 PictureBoxコントロールのストリームビデオからイメージ(またはスナップショット)をキャプチャしてSQL Serverに格納したいだけです。上記のコードは、コントロールがnullではないのにPictureBoxがビデオイメージを認識しないときに動作するか検出しますが、わかりません。 – Leinad

+1

個人的に私はディスク上のイメージとSQL Serverのパスを保存します。イメージをデータベースに直接格納することには、いくつかのパフォーマンス上の課題があります。少なくとも私は自分のテーブルではなく、Usersテーブルの列としてイメージを保存します。あなたのコードまでは、まだ詳細を提供していないので、私たちが助けることはできません。 –

答えて

0

この投稿のおかげで、Saving Panel as an Imageの解決策です。 PanelコントロールでPictureBoxコントロールを変更するだけでした。

private void button1_Click(object sender, EventArgs e){   
     SqlConnection con = new SqlConnection("Data Source=IBM-PC\\SQLEXPRESS2;Initial Catalog=DBACCESS;Integrated Security=True"); 

     MemoryStream ms = new MemoryStream(); 

     Bitmap bmp = new Bitmap(cmrConductor.Width, cmrConductor.Height); 
     cmrConductor.DrawToBitmap(bmp, cmrConductor.Bounds); 
     bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

     byte[] Pic_arr = new byte[ms.Length]; 
     ms.Position = 0; 
     ms.Read(Pic_arr, 0, Pic_arr.Length); 

     SqlCommand cmd = new SqlCommand("INSERT INTO tblUsers (fldCode, fldPic) VALUES (@fldCode, @fldPic)", con); 

     cmd.Parameters.AddWithValue("@fldCode", txtId.Text); 
     cmd.Parameters.AddWithValue("@fldPic", Pic_arr); 
     con.Open(); 
     try 
     { 
      int res = cmd.ExecuteNonQuery(); 
      if (res > 0) 
      { 
       MessageBox.Show("insert"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      con.Close(); 
     } 
    } 
1

画像フィールドの種類をvarbinary(MAX)に設定する必要があります。挿入する前に画像をバイト配列に変換する必要があります。

//Insert image 
SqlCommand comm = new SqlCommand("Insert into ImageColumn values (@Image)") 
comm.Parameters.AddWithValue("@Image", Converter.GetBytes(pictureBox.image)); 


//Retrieving image 
pictureBox1.Image = Converter.GetImage(dataTable.Rows[0]["ImageColumn"]) 


//Converter class 
class Converter 
{ 
    public static byte[] GetBytes(System.Drawing.Image imageIn) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      return ms.ToArray(); 
     } 
    } 
    public static byte[] GetBytes(string path) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      Image img = Image.FromFile(path); 
      img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      return ms.ToArray(); 
     } 
    } 
    public static Image GetImage(byte[] buffer) 
    { 
     using (var ms = new MemoryStream(buffer)) 
     { 
      return Image.FromStream(ms); 
     } 
    } 
} 
+0

それも動作します! – Leinad

関連する問題