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!