24

この質問をするのはほとんど嫌いですが、以前に何百万回も尋ねられたようですが、他の質問を調査しても、私の場合はまだこれを理解できないようです。

DateTime が null 許容型であることを読み、いくつかの例を試しましたが、SQLDATAREADER が失敗しているデータベースで NULL かどうかを調べようとしています。

エラー

System.Data.SqlTypes.SqlNullValueException: データが Null です。このメソッドまたはプロパティは、「Null 値で呼び出すことはできません」。

詳細クラス

private DateTime? startingDate;

public DateTime? StartingDate
{
    get{ return startingDate; }
    set{ startingDate = value; }
}

// constructor
Public DetailsClass(DateTime? startingDate)
{
    this.startingDate = startingDate;
}

DBクラス

   using (SqlConnection con = new SqlConnection(connectionString))
            using (SqlCommand cmd = con.CreateCommand())
            {

                List<DetailsClass> details = new List<DetailsClass>();
                DetailsClass dtl;
                try
                {
                    con.Open();
                    cmd.CommandText = "Stored Procedure Name";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@MyParameter", myparameter);

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            dtl = new DetailsClass((
                                reader.GetInt32(reader.GetOrdinal("MEMBERSHIPGEN"))),
                                reader.IsDBNull(1) ? null : reader.GetString(reader.GetOrdinal("EMAIL")),
                                reader.GetDateTime(reader.GetOrdinal("STARTINGDATE")));


                            details.Add(dtl);
                        }
                        reader.Close();
                        return details;

                    }
                }
4

5 に答える 5

1

デバッグ中にエラーが発生している行を正確に教えてください。それは簡単でしょう。

if (! reader.IsDBNull(reader.GetOrdinal("STARTINGDATE"))) {
    obj.startingDate = reader.GetDateTime(reader.GetOrdinal("STARTINGDATE"));
}

DBNull の場合は明示的に null を割り当てる必要はありません。これは null 許容型であり、デフォルトで null が含まれるためです。

わかりました、更新されたコードに従って(コメントに注意してください):

while (reader.Read()) {
    dtl = new DetailsClass((reader.GetInt32(reader.GetOrdinal("MEMBERSHIPGEN"))),

    // here you are checking null for email
    reader.IsDBNull(1) ? null : reader.GetString(reader.GetOrdinal("EMAIL")),

    // here you are not checking null for startingdate ?
    reader.GetDateTime(reader.GetOrdinal("STARTINGDATE")));
    details.Add(dtl);
}

より詳細な方法で試してみましょう:

while (reader.Read()) {

    dtl = new DetailsClass();

    dtl.membershipgen = reader.IsDBNull(reader.GetOrdinal("MEMBERSHIPGEN")) ? null : reader.GetInt32(reader.GetOrdinal("MEMBERSHIPGEN"));
    dtl.email = reader.IsDBNull(reader.GetOrdinal("EMAIL")) ? null : reader.GetString(reader.GetOrdinal("EMAIL")),
    dtl.startingdate = reader.IsDBNull(reader.GetOrdinal("STARTINGDATE")) ? null : reader.GetDateTime(reader.GetOrdinal("STARTINGDATE")));

    details.Add(dtl);
}
于 2013-07-05T14:17:58.673 に答える
0

これを試して:

次のようにstartingDate変数を作成します。nullable

DateTime? startingDate;

ここで、オブジェクトから値を取得するときは、次のように値がデータベースから返されているかどうかを判断するメソッドSqlDataReaderを使用する必要があります。IsDbNullNULL

if !reader.IsDBNull(reader.GetOrdinal("STARTINGDATE"))
{
    startingDate = reader.GetDateTime(reader.GetOrdinal("STARTINGDATE"));
}
else
{
    startingDate = null;
}

startingDate注:投稿されたコードには表示されていないため、データベースから読み取った値をどこに割り当てているのかわかりません。そのため、サンプルで直接割り当てましたが、サンプル ロジックの配置を調整する必要がある場合があります。

于 2013-07-05T13:50:33.080 に答える