2012-01-30 12 views
5

Estoy tratando de insertar una imagen en mi base de datos de acceso desde C# winform. Estoy utilizando el siguiente código:¿Qué está mal aquí? En mi código (Insertar imagen en la base de datos - C#)

private void button1_Click(object sender, EventArgs e) 
    { 
     OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb"); 
     OleDbCommand cmd = con.CreateCommand(); 
     cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img)"; 
     byte[] yourPhoto = imageToByteArray(pictureBox1.Image); 
     cmd.Parameters.AddWithValue("@img", yourPhoto); 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 

    public byte[] imageToByteArray(System.Drawing.Image iImage) 
    { 
     MemoryStream mMemoryStream = new MemoryStream(); 
     iImage.Save(mMemoryStream, System.Drawing.Imaging.ImageFormat.Png); 
     return mMemoryStream.ToArray(); 
    } 

Cuando ejecuto el código que me muestre un error: Syntax error in INSERT INTO statement. ¿Qué está mal aquí en mi código? Puedo insertar texto con éxito en los campos de la base de datos utilizando la misma consulta.

+0

http://lh4.ggpht.com/_eknxl1DkWrU/Sd9xo_Pt8PI/AAAAAAAAA-s/cQHUuxPpBeM/s1600 -h/UploadImage% 5B3% 5D.jpg – Madhu

+0

sigue sin funcionar después de agregar '@' con la img. –

+0

¿Cuáles son los tipos de datos de sus columnas? ¿Estás seguro de que 'Column4' es un valor válido para la columna Precio? –

Respuesta

6

Image es una reservados palabra, así que supongo que debe poner esta palabra entre comillas o corchetes en la consulta SQL.

+0

él está usando MS access –

+1

'Image' sigue siendo una palabra reservada para el motor de Jet. ¿No es aplicable http://support.microsoft.com/kb/321266 aquí? –

+0

+1 para la palabra clave de la imagen –

0

Prueba a introducir img como @img en la consulta SQL:

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img);"; 

EDIT: también terminan su consulta SQL con una '; '. Lo agregué en la consulta anterior.

+1

en realidad estoy usando el mismo código que ha mencionado, '@' queda al copiar el código de este sitio . Lo edité –

+0

Sí, todo lo que hice fue incluir el símbolo '@' en su código. Espero que haya ayudado. – Clayton

0

creo que se olvida de agregar un signo @ antes de que su parámetro:

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', img)"; 

debería ser

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img)"; 
0

intenta establecer el valor del parámetro "@img", pero la consulta sólo menciona "img", así que en lugar que necesita para establecer el texto de la consulta así:

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img)"; 
0

puede haber algunos datos de entrada que no están en buen estado, lo que lleva a la inyección Sql. entonces te sugiero que pruebes así. con consulta parametrizada. también intente dar un buen nombre descriptivo a sus columnas. La imagen será ambigua. como se tratará como palabra clave.

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, [Image]) VALUES (@column1, @column2, @column3, @column4, @img)"; 
cmd.Parameters.AddWithValue("@column1", yourval); 
cmd.Parameters.AddWithValue("@column2", yourval); 
cmd.Parameters.AddWithValue("@column3", yourval); 
cmd.Parameters.AddWithValue("@column4", yourval); 
cmd.Parameters.AddWithValue("@img", yourPhoto); 
+0

elimina las comillas en los parámetros @ColumnX en la parte derecha del CommandText :) –

1

probar esto y añadir parámetros a su otra columna:

private void button1_Click(object sender, EventArgs e) 
    { 
     OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb"); 
     OleDbCommand cmd = con.CreateCommand(); 
     cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price,[Image]) VALUES (@Product,@Manufacturer,@Description,@Price,@Image)"; 
     byte[] yourPhoto = imageToByteArray(pictureBox1.Image); 
     cmd.Parameters.AddWithValue("@Product", "yourProductValue"); 
     cmd.Parameters.AddWithValue("@Manufacturer","yourManufacturerValue"); 
     cmd.Parameters.AddWithValue("@Description", "yourDescriptionValue"); 
     cmd.Parameters.AddWithValue("@Price","yourPriceValue"); 
     cmd.Parameters.AddWithValue("@Image", yourPhoto); 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 

public byte[] imageToByteArray(System.Drawing.Image iImage) 
{ 
    MemoryStream mMemoryStream = new MemoryStream(); 
    iImage.Save(mMemoryStream, System.Drawing.Imaging.ImageFormat.Png); 
    return mMemoryStream.ToArray(); 
} 

Saludos

Cuestiones relacionadas