AFAIK не можете да извлечете байт [] с помощта на ExecuteScalar. Вместо това трябва да използвате ExecuteReader. За по-голяма сигурност, когато вмъквам параметри, предпочитам сам да определям типове, така че моето вмъкване изглежда така:
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();
}
}
След това мога да извлека и заредя изображението по следния начин:
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;
}
}
}
}
Не знам дали определянето на типа данни при вмъкване има някаква разлика, така че опитайте първо да извлечете с помощта на Reader. Ако това не проработи, предлагам да промените вашата рутина за вмъкване с нещо подобно на моята.
Моля, имайте предвид, че в моя пример id е цяло число, а не променлив символ!