【问题标题】:How to insert and retrieve image from PostgreSql using C#如何使用 C# 从 PostgreSql 中插入和检索图像
【发布时间】:2018-02-18 01:38:01
【问题描述】:

我正在尝试将图像插入 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;
}

插入图像的代码工作正常,但我无法在图片框中显示此图像。

我得到一个错误:

参数无效

请帮我解决这个问题

【问题讨论】:

    标签: c# sql postgresql


    【解决方案1】:

    AFAIK 您无法使用 ExecuteScalar 检索字节 []。您应该改用 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;
                }
            }
        }
    }
    

    我不知道在插入时指定数据类型是否有任何区别,因此请先尝试使用阅读器进行检索。如果这不起作用,那么我建议将您的插入例程更改为类似我的。

    请注意,在我的示例中,id 是一个整数,而不是一个可变的字符!

    【讨论】:

    • 先生,谢谢您的回复。我又遇到同样的错误..参数无效
    • @Sivashankar 您是否尝试过像我一样更换您的插件?
    • string sql = "插入 membermaster (memberid, member_photo) VALUES('655', @Image)";使用 (var command = new NpgsqlCommand(sql, Program.conn)) { NpgsqlParameter param = command.CreateParameter(); param.ParameterName = "@Image";参数.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Bytea;参数.Value = ImgByteA; command.Parameters.Add(param); Program.conn.Close(); Program.conn.Open(); command.ExecuteNonQuery(); }
    • 在这一行显示错误 pictureBox1.Image = imageConverter.ConvertFrom(productImageByte) as System.Drawing.Image;
    • 您是否检查过检索到的 byte[] 是否与您插入的相同?
    猜你喜欢
    • 2017-11-06
    • 2015-05-14
    • 2018-06-08
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2012-11-24
    相关资源
    最近更新 更多