2

次のコードで GridView コントロールをバインドしようとしています。しかし、「Data is Null. This method or property cannot be called on Null values.」というエラーが表示されます。エラー行は「 p.MaterialName = reader.GetString(reader.GetOrdinal("MaterialName"));」です。Materials テーブルのすべてのフィールドにデータがあります。コードの何が問題になっていますか? 修正するのを手伝ってください。

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

1 に答える 1

0

データがあるべきだとあなたが言ったことは知っていますが、これは通常、データが欠落しているときにスローされます。

データベースで「MaterialName」が null かどうかを確認してください。

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

これが機能しても、別の行でエラーが発生する場合は、それらの行でも null を確認する必要があります。


「MaterialPrice」フィールドには、次のようなものを使用します: (p.MaterialPriceが null 許容でない場合は、(decimal)nullのようなデフォルト値に置き換えます0)

p.MaterialPrice
    = reader.IsDBNull("MaterialPrice")
        ? (decimal)null : reader.GetDecimal(reader.GetOrdinal("MaterialPrice"))
于 2013-08-10T10:33:57.307 に答える