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
相关产品推荐
相关产品推荐

