簡體   English   中英

如何使用 C# 從 PostgreSql 插入和檢索圖像

[英]How to insert and retrieve image from PostgreSql using C#

我正在嘗試將圖像插入 Postgres 並使用 C# 從 postgresql 檢索該圖像。

我的表中有兩列: memberid (字符變化)和member_photo (bytea)

這是我插入圖像的代碼:

using (FileStream pgFileStream = new FileStream("D:\\Capture.jpg", FileMode.Open, FileAccess.Read))
{
    using (BinaryReader pgReader = new BinaryReader(new BufferedStream(pgFileStream)))
    {
        NpgsqlCommand command = new NpgsqlCommand();

        byte[] ImgByteA = pgReader.ReadBytes(Convert.ToInt32(pgFileStream.Length));
        command.CommandText = "insert into membermaster (memberid, member_photo) VALUES ('65', @Image)";
        command.Connection = Program.conn;

        Program.conn.Close();
        Program.conn.Open();

        //command.Parameters.Add(new NpgsqlParameter("Image", ImgByteA));
        command.Parameters.Add("@Image", ImgByteA).Value = ImgByteA;

        command.ExecuteNonQuery();

        Program.conn.Close();
    }
}

這是我檢索圖像的代碼

NpgsqlCommand command = new NpgsqlCommand();
command.CommandText = "select member_photo from membermaster where memberid='65'";
command.Connection = Program.conn;

try
{
    Program.conn.Close();
    Program.conn.Open();

    byte[] productImageByte = command.ExecuteScalar() as byte[];

    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;
            // image.Save(imageFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);

            pictureBox1.Image = System.Drawing.Image.FromStream(productImageStream);
        }
    }
}
catch
{
    Program.conn.Close();
    throw;
}

插入圖片的代碼工作正常,但我無法在圖片框中顯示此圖片。

我得到一個錯誤:

參數無效

請幫我解決這個問題

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;
            }
        }
    }
}

我不知道在insert上指定數據類型是否有任何區別,所以請先嘗試使用Reader進行檢索。 如果這不起作用,那么我建議將插入例程更改為類似我的。

請注意在我的例子中id是一個整數,而不是一個變化的字符!

雖然接受的答案中的代碼有效,但您不能使用 ExecuteScalar 是不正確的。 這在舊版本中可能是個問題,但使用 Npgsql 6.0.7 可以執行以下操作:

 public static async Task<byte[]?> GetByteaAsync(int id, string connectionString) {
    byte[]? result = null;
    await using (var con = new NpgsqlConnection(connectionString)) {
        await con.OpenAsync();
        await using (var cmd = new NpgsqlCommand("SELECT field_name from table_name where id=@id", con) {CommandType = CommandType.Text}) {
            cmd.Parameters.Add("@id", NpgsqlDbType.Integer).Value = id;

            result = ((byte[]?) await cmd.ExecuteScalarAsync());
        }

        await con.CloseAsync();
    }

    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM