我正在尝试使用以下代码绑定GridView控件。但是我收到错误消息“数据为空。不能在空值上调用此方法或属性。”错误行是“ p.MaterialName = reader.GetString(reader.GetOrdinal(“ MaterialName”));“我在材料表的所有字段中都有数据。代码有什么问题?请帮助我修复它。

public static List<Product> GetMaterials()
{
    SqlHelper objSqlHelper = new SqlHelper();
    SqlDataReader reader = objSqlHelper.ExecuteReader("GetMaterials");
    List<Product> objMaterials = new List<Product>();
    Product p = new Product();
    while (reader.Read())
    {
        p.MaterialId = reader.GetInt32(reader.GetOrdinal("MaterialId"));
        p.MaterialName = reader.GetString(reader.GetOrdinal("MaterialName"));
        p.desc = reader.GetString(reader.GetOrdinal("desc"));
        p.MaterialPrice = reader.GetDecimal(reader.GetOrdinal("MaterialPrice"));
        p.Datasheet = reader.GetString(reader.GetOrdinal("Datasheet"));
        objMaterials.Add(p);
    }
    reader.Close();
    return objMaterials;
}

最佳答案

我知道您说过应该有数据,但这通常在数据丢失时抛出。

尝试检查数据库中的“ MaterialName”是否为空:

p.MaterialName = reader.IsDBNull("MaterialName")
                   ? null : reader.GetString(reader.GetOrdinal("MaterialName"))


如果这可行,但是在另一行上出现错误,则可能还必须检查这些行上的空值。



对于“ MaterialPrice”字段,使用类似以下的内容:(如果p.MaterialPrice不可为空,则将(decimal)null替换为某些默认值,例如0

p.MaterialPrice
    = reader.IsDBNull("MaterialPrice")
        ? (decimal)null : reader.GetDecimal(reader.GetOrdinal("MaterialPrice"))

09-25 22:55