2016-09-19 3 views
1

Ich habe Video auf ein PictureBox-Steuerelement streamen, und ich möchte Bild von PictureBox abrufen, um auf einer Tabelle auf SQL Server zu speichern. PictureBox show stream, aber PictureBox ruft null ab.Speichern Sie Image auf SQL Server, aus Stream auf PictureBox-Steuerelement

Was ist los?

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

Ihre Frage ist überhaupt nicht klar. Es ist fast unmöglich, hier eine Lösung anzubieten, weil wir nicht genug Details haben, um damit zu arbeiten. Etwas abseits von Thema, aber Sie sollten diesen Artikel über AddWithValue lesen. http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/ –

+0

Ich weiß, es ist kompliziert zu erklären, eigentlich bin ich ein Anfänger Entwickler. Ich möchte nur das Bild (oder Snapshot) aus einem Stream-Video von einem PictureBox-Steuerelement erfassen und auf SQL Server speichern. Der obige Code funktioniert oder erkennt, wenn Kontrolle nicht Null ist, aber PictureBox das Videobild nicht erkennt, weiß ich nicht. – Leinad

+1

Persönlich würde ich Bild auf CD und den Pfad in SQL Server speichern. Das Speichern von Bildern direkt in der Datenbank birgt einige Performance-Probleme. Zumindest würde ich die Bilder in einer eigenen Tabelle statt als Spalte in der Tabelle Benutzer speichern. Soweit Ihr Code keine Chance hat, können wir Ihnen helfen, da Sie noch keine Angaben gemacht haben. –

Antwort

0

Hier ist die Lösung, dank diesem Beitrag Saving Panel as an Image. Ich musste nur PictureBox-Steuerelement von einem Panel-Steuerelement ändern.

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

Sie benötigen Bildfeld-Typ als varbinary (MAX) eingestellt werden, und Sie müssen Ihr Bild in ein Byte-Array konvertieren, bevor das Einfügen.

//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

Das funktioniert auch! – Leinad

Verwandte Themen