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!