sql >> Base de Datos >  >> RDS >> Sqlserver

Almacenar la imagen en la base de datos y recuperarla

Tienes varios problemas con tu código. Lo abordaré línea por línea:

MemoryStream ms =new MemoryStream();
byte[] PhotoByte=null;
PhotoByte=ms.ToArray();
pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
PhotoByte =ms.ToArray();

Si bien no es un problema, tiene asignaciones innecesarias aquí. El código anterior podría escribirse más claramente de esta manera:

MemoryStream ms =new MemoryStream();
pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
byte[] PhotoByte =ms.ToArray();

A continuación, el siguiente código no usa parámetros. Siempre, siempre, SIEMPRE parametriza tus consultas SQL en lugar de construir dinámicamente el SQL. No, en serio, siempre. Sí, incluso entonces. (Además, ¿cuál es el Str ¿variable? ¿Algún tipo de variable de instancia reutilizada? No hagas eso.)

Str = "insert into Experimmm Values('" + PhotoByte + "','" + textBox1.Text + "')";
Conn.Open();
cmd.Connection = Conn;
cmd.CommandText = Str;
cmd.ExecuteNonQuery();
Conn.Close();

En su lugar, debería ser esto:

Conn.Open();
using(SqlCommand cmd = connection.CreateCommand())
{
    cmd.CommandText = "insert into Experimmm (column list) values(@data, @name)";

    cmd.Parameters.Add("@data", SqlDbType.VarBinary).Value = PhotoByte;
    cmd.Parameters.Add("@name", SqlDbType.VarChar, yourlength).Value = textBox1.Text;

    cmd.ExecuteNonQuery();
}
Conn.Close();

A continuación, pasaremos a su recuperación. Nuevamente con el Str variable, no hagas este tipo de cosas. Además, también debe parametrizar esta consulta.

byte[] data;
string name;

Conn.Open();
using(SqlCommand cmd = Conn.CreateCommand())
{    
    cmd.CommandText = "select column_list from Experimmm where id = @id";

    cmd.Parameters.Add("@id", SqlDbType.VarChar, field_length).Value = textBox2.Text;

    using(SqlDataReader dr = cmd.ExecuteReader())
    {
        if (dr.Read())
        {
            data = (byte[])dr.GetValue(0); 
            name = (string)dr.GetValue(1);
        }
    }
}
Conn.Close();

label1.Text = name;
pictureBox2.Image = Image.FromStream(new MemoryStream(data));