【问题标题】:"Object cannot be cast from DBNull to other types" in c#c# 中的“对象不能从 DBNull 转换为其他类型”
【发布时间】:2015-01-30 06:37:13
【问题描述】:

我以前没有遇到过这种情况,但是出现这种情况的情况我经历过很多次。

比如我有这个方法:

mySqlCommand = mySqlConnect.CreateCommand();
mySqlCommand.CommandText = "SELECT EquipmentNumber, EquipmentType, P.AreaCode AS Location, EquipmentDsc FROM MajorEquipment ME"
  + " INNER JOIN PlantAreaCodes P ON ME.PACId = P.PACId WHERE"
  + "(@EquipNumber IS NULL OR EquipmentNumber LIKE @EquipNumber)"
  + " AND ((SELECT PACId FROM PlantAreaCodes WHERE AreaCode = @Location) IS NULL OR ME.PACId = (SELECT PACId FROM PlantAreaCodes WHERE AreaCode = @Location))"
  + " AND (@EquipType IS NULL OR EquipmentType LIKE @EquipType)"
  + " AND (@Comments IS NULL OR EquipmentDsc LIKE @Comments);";

mySqlCommand.Parameters.Add("@EquipNumber", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@Location", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@EquipType", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@Comments", MySqlDbType.VarChar);

mySqlCommand.Parameters["@EquipNumber"].Value = MeModel.EquipmentNumber;
mySqlCommand.Parameters["@Location"].Value = MeModel.Location;
mySqlCommand.Parameters["@EquipType"].Value = MeModel.EquipmentType;
mySqlCommand.Parameters["@Comments"].Value = MeModel.Notes;

mySqlReader = mySqlCommand.ExecuteReader();

MajorEquipment_Controller.MeList = new List<MajorEquipment_Model>();

while (mySqlReader.Read())
{
    Console.WriteLine(mySqlReader["EquipmentDsc"].GetType());
    MajorEquipment_Controller.MeList.Add(new MajorEquipment_Model
    {
        EquipmentNumber = Convert.ToString(mySqlReader["EquipmentNumber"]),
        EquipmentType = Convert.ToString(mySqlReader["EquipmentType"]),
        Location = Convert.ToString(mySqlReader["Location"]),
        Notes = Convert.ToString(mySqlReader["EquipmentDsc"])
    });
}
mySqlReader.Close();
mySqlCommand.ExecuteNonQuery();

在这个方法中,EquipmentDscallows 是System.DBNull,但是我之前从来没有遇到过问题。

但是,在一个单独的程序中,我有一个类似的方法:

mySqlCommand = mySqlConnect.CreateCommand();
mySqlCommand.CommandText = "SELECT * FROM IT_Requests;";

mySqlReader = mySqlCommand.ExecuteReader();

IT_Admin.Admin_Controller.List = new List<IT_Admin.Admin_Model>();

while (mySqlReader.Read())
{
    MessageBox.Show((mySqlReader["Name"].GetType()).ToString());
    IT_Admin.Admin_Controller.List.Add(new IT_Admin.Admin_Model
    {
        ReqID = Convert.ToInt32(mySqlReader["ReqID"]),
        Issue = Convert.ToString(mySqlReader["Issue"]),
        PC = Convert.ToString(mySqlReader["PC"]),
        Date = Convert.ToString(mySqlReader["ReqDate"]),
        Name = Convert.ToString(mySqlReader["Name"]),
        ReqType = Convert.ToString(mySqlReader["ReqType"]),
        Urgency = Convert.ToInt32(mySqlReader["Urgency"]),
        Description = Convert.ToString(mySqlReader["Description"]),
        PrevReport = Convert.ToBoolean(mySqlReader["PrevReport"]),
        Completed = Convert.ToBoolean(mySqlReader["Completed"]),
        Resolution = Convert.ToString(mySqlReader["Resolution"]),
        ResDate = Convert.ToString(mySqlReader["ResDate"])
    });
}

一旦达到空值,它就会吐出“InvalidCastException”错误。

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    Convert.ToString 允许NULL DB 值,因为System.String 本身是可空引用类型,而System.Boolean 是不可空值类型。

    对您正在读取的每个可为空的列执行此操作:

    Object value = mySqlReader["columnName"];
    if( value != DBNull.Value ) {
        destination = Convert.ToSomeStrongType( value );
    } else {
        destination = null;
    }
    

    【讨论】:

      【解决方案2】:

      您所要做的就是提前检查 DBNull。

      例如

      if (!mySqlReader["ReqID"] is DBNull)
      { 
          ReqID = Convert.ToInt32(mySqlReader["ReqID"]);
      }
      

      对未来问题的建议:尝试将您的代码示例缩小到相关点。在这种情况下,您提供了一些相当大的样本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多