繁体   English   中英

如果其值为 null,则将图像从数据库加载到 windows 表单中

[英]Loading an image from a database into a windows form if its value is null

双击此 windows 表单中包含的此数据网格 object 中包含的数据时,将出现一个辅助表单,以便可以编辑数据库。

在此处输入图像描述

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

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);
               }
         }
      }
   }
}

这是一个常见问题,解决方案很简单——首先检查一下它是什么。

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

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

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

像这样:

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." );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM