如果图像的值为空,则将图像从数据库加载到 Windows 窗体中

Posted

技术标签:

【中文标题】如果图像的值为空,则将图像从数据库加载到 Windows 窗体中【英文标题】:Loading an image from a database into a windows form if its value is null 【发布时间】:2021-05-03 22:06:14 【问题描述】:

当双击此窗体中包含的此数据网格对象中包含的数据时,会出现一个辅助窗体,以便可以编辑数据库。

但是,如果数据库中当前没有存储图像(其值为空),则会发生以下异常:

System.InvalidCastException: 'Unable to cast object of type 'System.DBNull' to type 'System.Byte[]'.'

纠正代码以使图像正确加载到其对应的图片框的最佳方法是什么? 这是发生异常的部分代码。

private void StudentForm_Load(object sender, EventArgs e)

   //For Update Process
   if (this.IsUpdate == true)
   
      using (SqlConnection con = new SqlConnection(AppConnection.GetConnectionString()))
      
         using (SqlCommand cmd = new SqlCommand("usp_Students_ReloadDataForUpdate", con))
         
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@StudentName", this.StudentName);

            if (con.State != ConnectionState.Open)
               con.Open();

            DataTable dtStudent = new DataTable();

            SqlDataReader sdr = cmd.ExecuteReader();

            dtStudent.Load(sdr);

            DataRow row = dtStudent.Rows[0];

            StudentNameTextBox.Text = row["StudentName"].ToString();
            AgeTextBox.Text = row["Age"].ToString();
            GenderTextBox.Text = row["Gender"].ToString();
            DescriptionTextBox.Text = row["Description"].ToString();

               var pic = (byte[])row["Image"]; //<-- where the exception occurs
               if (pic != null)
               
                  MemoryStream ms = new MemoryStream(pic);
                  IdPictureBox.Image = Image.FromStream(ms);
               
         
      
   

【问题讨论】:

通过比较对象引用和DBNull.Value来检查空值。 如果您发现某个答案有帮助,您可以保护它(点击答案旁边的向上箭头),请注意,与接受答案不同,您可以对任何答案进行投票。 【参考方案1】:

这是一个常见的问题,解决方法很简单——先看看是什么问题。

这样做有多种方法,我喜欢创建通用扩展方法,但最简单的可能是使用 MS 类 DataRowExtensions

var pic = row.Field<byte[]>(“Image”); //<-- where the exception occurs

您必须包含 DataRowExtensions,仅此而已。

【讨论】:

【参考方案2】:

像这样:

Object imageOrDBNull = row["Image"];
if( imageOrDBNull == DBNull.Value ) 
    // ...

else if( imageOrDBNull is Byte[] bytes ) 
    Image current = this.IdPictureBox.Image;
    if( current != null ) 
        this.IdPictureBox.Image = null;
        current.Dispose();
        current = null;
    

    try
    
        this.IdPictureBox.Image = Image.FromStream( new MemoryStream( bytes, writable: false ) );
    
    catch( Exception ex )
    
        // TODO: Error handling.
    

else 
    throw new InvalidOperationException( "Expected DBNull or Byte[], but encountered " + ( imageOrDBNUll?.GetType() ?? "null" ) + " instead." );


【讨论】:

以上是关于如果图像的值为空,则将图像从数据库加载到 Windows 窗体中的主要内容,如果未能解决你的问题,请参考以下文章

如果不同工作表上的值匹配,则将数据从一张工作表复制到另一张工作表

如果相机旋转,来自相机的图像为空

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)

如果 div 没有 img 标签,则将“无图像”img 添加到 div(Javascript 或 Jquery)

只是尝试播放框架,提交表单的值为空

一个脚本文件的解析