AFAIKは、ExecuteScalarを使用してbyte[]を取得することはできません。代わりに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は整数であり、文字が変化しないことに注意してください!