错误:无法将类型为“System.DBNull”的对象强制转换为类型“System.Byte[]”。

本文介绍了解决从数据库读取员工图片时遇到的对象为空错误的方法。通过添加一层判断来检查获取的数据是否为DBNull.Value,从而避免空指针异常,并正确显示图片或设置为null。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在读取员工图片时遇到这个错误!如何解决?

这是说明对象为空了,就不能强转了,返回值是null,所以不能进行转换操作

比如
byte[])reader["zp"]为空

只要加层判断即可

 

              if (dr.GetValue(7) != DBNull.Value)
                {
                    imagebytes = (byte[])dr.GetValue(7);
                    MemoryStream mms = new MemoryStream(imagebytes);
                    Bitmap bmpt2 = new Bitmap(mms);
                    pictureBox1.Image = bmpt2;
                }
                else
                {
                    pictureBox1.Image = null;
                }

 

 

参考:http://heisetoufa.javaeye.com/blog/243218

 

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _2 { public partial class FormUpdatePoint : Form { public int Pid { get; set; } public string Pname { get; set; } public string Stype { get; set; } public string Savedate { get; set; } public string Content { get; set; } public byte[] ImageData { get; set; } private Dao2 _dao; // 使用 Dao2 类来管理数据库连接 private SqlConnection _conn; public FormUpdatePoint() { InitializeComponent(); dtpDate.Enabled = true; // 确保日期控件可编辑 } private void FormUpdatePoint_Load(object sender, EventArgs e) { // 初始化数据库连接 _dao = new Dao2(); _dao.Connect(); _conn = _dao.Connection; // 关键修复:获取Dao2的连接对象 // 使用当前实例的属性(非静态) txtPid.Text = this.Pid.ToString(); txtPname.Text = this.Pname; txtContent.Text = this.Content; txtStype.Text = this.Stype; // 日期处理 if (DateTime.TryParse(this.Savedate, out DateTime savedate)) { dtpDate.Value = savedate; } else { dtpDate.Value = DateTime.Now; } // 图片显示 if (this.ImageData != null && this.ImageData.Length > 0) { using (MemoryStream ms = new MemoryStream(this.ImageData)) { pictureBox1.Image = Image.FromStream(ms); } } } private void pabtn2_Click(object sender, EventArgs e) { try { // 确保连接已打开 if (_conn.State != ConnectionState.Open) _conn.Open(); string sql = @"UPDATE T_Point SET Pname = @Pname, Stype = @Stype, Content = @Content, Savedate = @Savedate, Image = @Image WHERE Pid = @Pid"; using (SqlCommand cmd = new SqlCommand(sql, _conn)) { cmd.Parameters.AddWithValue("@Pname", txtPname.Text); cmd.Parameters.AddWithValue("@Stype", txtStype.Text); cmd.Parameters.AddWithValue("@Content", txtContent.Text); cmd.Parameters.AddWithValue("@Savedate", dtpDate.Value); cmd.Parameters.AddWithValue("@Pid", this.Pid); // 处理图片参数 if (this.ImageData != null && this.ImageData.Length > 0) { cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = this.ImageData; } else { cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = DBNull.Value; } int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { MessageBox.Show("更新成功!"); this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show("更新失败,未找到记录"); } } } catch (SqlException ex) { MessageBox.Show($"数据库错误: {ex.Message}"); } catch (Exception ex) { MessageBox.Show($"错误: {ex.Message}"); } finally { _dao.Close(); } } private void pcbtn2_Click(object sender, EventArgs e) { this.Close(); } private void btnChooseImage_Click(object sender, EventArgs e) { using (OpenFileDialog openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "图像文件|*.png;*.jpg;*.jpeg;*.bmp|所有文件|*.*"; if (openFileDialog.ShowDialog() == DialogResult.OK) { try { // 直接加载图片到PictureBox pictureBox1.Image = Image.FromFile(openFileDialog.FileName); // 更新ImageData属性 using (MemoryStream ms = new MemoryStream()) { pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); this.ImageData = ms.ToArray(); } } catch (Exception ex) { MessageBox.Show($"加载图片失败: {ex.Message}"); } } } } private void FormUpdatePoint_FormClosed(object sender, FormClosedEventArgs e) { _dao?.Close(); } private void btnSelectImage_Click(object sender, EventArgs e) { }如何实现选择图片实现修改
07-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值