sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo insertar y recuperar una imagen de PostgreSql usando C#

AFAIK no puede recuperar un byte [] usando ExecuteScalar. Debería usar ExecuteReader en su lugar. Solo para estar seguro al insertar parámetros, prefiero especificar los tipos yo mismo, por lo que mi inserción se ve así:

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

Luego puedo recuperar y cargar la imagen de esta manera:

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

No sé si especificar el tipo de datos en la inserción hace alguna diferencia, así que primero intente recuperar usando un Lector. Si eso no funciona, sugiero cambiar su rutina de inserción a algo como la mía.

¡Tenga en cuenta que en mi ejemplo, la identificación es un número entero, no un carácter variable!