Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Stocker l'image dans la base de données et la récupérer

Vous avez plusieurs problèmes avec votre code. Je vais y répondre ligne par ligne :

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

Bien que ce ne soit pas un problème, vous avez ici des devoirs inutiles. Le code ci-dessus pourrait être écrit plus clairement de cette façon :

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

Ensuite, le code suivant n'utilise pas de paramètres. Toujours, toujours, TOUJOURS paramétrer vos requêtes SQL au lieu de construire dynamiquement le SQL. Non, sérieusement, toujours. Oui, même alors. (Aussi, quel est le Str variable? Une sorte de variable d'instance réutilisée ? Ne faites pas ça.)

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

Au lieu de cela, cela devrait être ceci :

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();

Ensuite, nous passerons à votre récupération. Encore une fois avec le Str variable, ne faites pas ce genre de chose. De plus, vous devez également paramétrer cette requête.

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));