PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come inserire e recuperare un'immagine da PostgreSql usando C#

AFAIK non è possibile recuperare un byte[] utilizzando ExecuteScalar. Dovresti usare invece ExecuteReader. Giusto per essere sicuro quando inserisco i parametri, preferisco specificare i tipi da solo, quindi il mio inserto si presenta così:

using (var conn = new NpgsqlConnection(connString))
{
    string sQL = "insert into picturetable (id, photo) VALUES(65, @Image)";
    using (var command = new NpgsqlCommand(sQL, conn))
    {
        NpgsqlParameter param = command.CreateParameter();
        param.ParameterName = "@Image";
        param.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Bytea;
        param.Value = ImgByteA;
        command.Parameters.Add(param);

        conn.Open();
        command.ExecuteNonQuery();
    }
}

Posso quindi recuperare e caricare l'immagine in questo modo:

using (var conn = new NpgsqlConnection(connString))
{
    string sQL = "SELECT photo from picturetable WHERE id = 65";
    using (var command = new NpgsqlCommand(sQL, conn))
    {
        byte[] productImageByte = null;
        conn.Open();
        var rdr = command.ExecuteReader();
        if (rdr.Read())
        {
            productImageByte = (byte[])rdr[0];
        }
        rdr.Close();
        if (productImageByte != null)
        {
            using (MemoryStream productImageStream = new System.IO.MemoryStream(productImageByte))
            {
                ImageConverter imageConverter = new System.Drawing.ImageConverter();
                pictureBox1.Image = imageConverter.ConvertFrom(productImageByte) as System.Drawing.Image;
            }
        }
    }
}

Non so se specificare il tipo di dati sull'inserto fa la differenza, quindi prova prima a recuperare usando un Reader. Se non funziona, ti suggerisco di cambiare la tua routine di inserimento in qualcosa di simile alla mia.

Tieni presente che nel mio esempio l'id è un numero intero, non un carattere variabile!