PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Einfügen und Abrufen von Bildern aus PostgreSql mit C#

AFAIK Sie können ein Byte [] nicht mit ExecuteScalar abrufen. Sie sollten stattdessen ExecuteReader verwenden. Nur um beim Einfügen von Parametern auf der sicheren Seite zu sein, lege ich Typen lieber selbst fest, daher sieht meine Einfügung so aus:

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

Ich kann das Bild dann wie folgt abrufen und 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;
            }
        }
    }
}

Ich weiß nicht, ob die Angabe des Datentyps beim Einfügen einen Unterschied macht, also versuchen Sie es zuerst mit einem Reader. Wenn das nicht funktioniert, dann schlage ich vor, Ihre Einfügungsroutine in etwas wie meine zu ändern.

Bitte beachten Sie, dass die ID in meinem Beispiel eine Ganzzahl ist, kein Zeichen, das variiert!