AFAIK vous ne pouvez pas récupérer un byte[] en utilisant ExecuteScalar. Vous devriez utiliser ExecuteReader à la place. Juste pour être sûr lors de l'insertion de paramètres, je préfère spécifier les types moi-même, donc mon insert ressemble à ceci :
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();
}
}
Je peux ensuite récupérer et charger l'image comme ceci :
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;
}
}
}
}
Je ne sais pas si la spécification du type de données lors de l'insertion fait une différence, alors essayez d'abord de récupérer à l'aide d'un lecteur. Si cela ne fonctionne pas, je vous suggère de changer votre routine d'insertion pour quelque chose comme la mienne.
Veuillez noter que dans mon exemple, l'identifiant est un entier, pas un caractère variable !