You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 从MySQL读取图片赋值给PictureBox出现类型转换错误如何解决

问题修复方案

错误原因

  • 语法错误:mdr.("Photo") 写法缺少取值方法,无法正常读取字段内容
  • 类型不匹配:MySQL存储图片通常使用BLOB类二进制字段,读取后为byte[]字节数组,无法直接赋值给PictureBox.Image属性,需要做类型转换
  • 额外风险:原代码使用字符串拼接SQL,存在SQL注入漏洞,且未处理异常场景下的数据库连接释放问题

修复代码

场景1:数据库Photo字段存储二进制图片(推荐)

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string sqlstring = "database = db_phonebook; user = root; password = ''; server = 'localhost'; SSL Mode = None";
    // using包裹自动释放资源,无需手动关闭连接
    using (MySqlConnection mysqlcon = new MySqlConnection(sqlstring))
    {
        // 参数化查询避免SQL注入
        string selectquery = "SELECT * FROM tbl_phonebook WHERE CID LIKE @cidPrefix";
        using (MySqlCommand mysqlcom = new MySqlCommand(selectquery, mysqlcon))
        {
            mysqlcom.Parameters.AddWithValue("@cidPrefix", this.textBox1.Text + "%");
            mysqlcon.Open();
            using (MySqlDataReader mdr = mysqlcom.ExecuteReader())
            {
                if (mdr.Read())
                {
                    cid.Text = mdr.GetString("CID");
                    name.Text = mdr.GetString("Name");
                    address.Text = mdr.GetString("Address");
                    contact.Text = mdr.GetString("Contact_Number");
                    email.Text = mdr.GetString("Email_Address");
                    
                    // 图片字段处理逻辑
                    int photoIndex = mdr.GetOrdinal("Photo");
                    if (!mdr.IsDBNull(photoIndex))
                    {
                        // 读取二进制字节数组
                        byte[] imgBytes = (byte[])mdr[photoIndex];
                        // 用内存流加载为Image对象
                        using (MemoryStream ms = new MemoryStream(imgBytes))
                        {
                            photobox.Image = Image.FromStream(ms);
                        }
                    }
                    else
                    {
                        // 字段为空时清空图片
                        photobox.Image = null;
                    }
                }
                else
                {
                    MessageBox.Show("Record Not Found!");
                    // 无匹配数据时清空所有控件
                    cid.Text = name.Text = address.Text = contact.Text = email.Text = "";
                    photobox.Image = null;
                }
            }
        }
    }
}

需要提前引入对应命名空间:

using System.IO;
using System.Drawing;

场景2:数据库Photo字段存储的是本地图片路径

如果你的Photo字段存的是图片的文件路径字符串,直接替换图片处理逻辑即可:

int photoIndex = mdr.GetOrdinal("Photo");
if (!mdr.IsDBNull(photoIndex))
{
    string imgPath = mdr.GetString(photoIndex);
    if (File.Exists(imgPath))
    {
        photobox.Image = Image.FromFile(imgPath);
    }
    else
    {
        photobox.Image = null;
    }
}

内容的提问来源于stack exchange,提问作者nica123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:06:01