AFAIK nie możesz pobrać byte[] za pomocą ExecuteScalar. Zamiast tego powinieneś użyć ExecuteReader. Aby być po bezpiecznej stronie podczas wstawiania parametrów, wolę samodzielnie określać typy, więc moja wstawka wygląda tak:
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();
}
}
Następnie mogę pobrać i załadować obraz w ten sposób:
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;
}
}
}
}
Nie wiem, czy określenie typu danych we wstawce ma jakiekolwiek znaczenie, więc spróbuj najpierw pobrać za pomocą czytnika. Jeśli to nie zadziała, sugeruję zmianę procedury wstawiania na coś podobnego do mojego.
Proszę zauważyć, że w moim przykładzie id jest liczbą całkowitą, a nie zmiennym znakiem!