C # Insertar imagen en MS Access

Me gustaría agradecer a todos los que ayudaron en la última pregunta. Pero ahora, tengo un problema con otra statement que es saveimageto MS Access. Primero, me gustaría preguntar, en la base de datos de acceso ms, ¿el tipo de datos debería poner el archivo adjunto?

mi código:

private void button2_Click(object sender, EventArgs e) { OleDbCommand cmd = new OleDbCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into Table1 (id,picture) values ('" + textBox1.Text + "')"; cmd.Connection = con; con.Open(); cmd.ExecuteNonQuery(); System.Windows.Forms.MessageBox.Show("Created", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); con.Close(); } 

Inserto mi imagen en picturebox utilizando openFIledialog.

    Primero, use los parámetros. NUNCA concatena cadenas para los comandos SQL, ya que se abre a la Inyección SQL. Es una buena práctica fácil de seguir que te evitará muchos problemas en el futuro.

    Dicho esto, algo como esto debería funcionar:

     // You've got the filename from the result of your OpenDialog operation var pic = File.ReadAllBytes(yourFileName); OleDbCommand cmd = new OleDbCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into Table1 (id, picture) values (@p1, @p2)"; cmd.Parameters.AddWithValue("@p1", TextBox1.Text); cmd.Parameters.AddWithValue("@p2", pic); cmd.ExecuteNonQuery(); 

    Citar de memoria aquí, pero hágame saber si ese código le da problemas. Si recuerdo correctamente, algo así debería funcionar.

    EDITAR.- Si está cargando la imagen en un control PictureBox, convierta esa imagen en una matriz de bytes y luego use esa matriz de bytes como segundo parámetro.

    EDITAR (2) .- Un poco de aclaración. Si está obteniendo su imagen de un archivo, tiene una ruta de acceso a ella; luego puede usar File.ReadAllBytes(string path) . En mi ejemplo, asumí que yourFileName era el archivo y la ruta de acceso del archivo seleccionado después de una operación OpenDialog exitosa. Así que puedes usarlo así:

     byte[] fromPath = File.ReadAllBytes(@"C:\walls\aurora.jpg"); 

    y almacenaría en la matriz de bytes de la imagen, convertida a bytes y lista para ser utilizada en un comando de inserción como se ve arriba.

    PERO si obtienes tu imagen de un control de cuadro de imagen, las cosas son un poco diferentes:

     MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms, Imaging.ImageFormat.Jpeg); byte[] fromControl = ms.GetBuffer(); 

    En ese ejemplo, he creado un MemoryStream , lo llené con el contenido del control de picturebox y luego lo pasé a la matriz de bytes, y nuevamente estamos listos para usarlo como un parámetro para nuestra consulta de inserción.

    Oh, no olvides añadir

     using System.IO; using System.Drawing; 

    a sus usos.