我正在尝试使用以下代码绑定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"))