AFAIK u kunt een byte[] niet ophalen met behulp van ExecuteScalar. Gebruik in plaats daarvan ExecuteReader. Voor de zekerheid bij het invoegen van parameters geef ik er de voorkeur aan zelf typen op te geven, dus mijn invoeging ziet er als volgt uit:
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();
}
}
Ik kan de afbeelding dan als volgt ophalen en laden:
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;
}
}
}
}
Ik weet niet of het specificeren van het datatype bij het invoegen enig verschil maakt, dus probeer het eerst op te halen met een Reader. Als dat niet werkt, raad ik je aan om je invoegroutine te veranderen in iets als het mijne.
Let op:in mijn voorbeeld is id een geheel getal, geen karakter dat varieert!