0

グリッドビューでDBからデータをバインドしていましたが、データソースの「CountryList」では、データリーダーから行が追加されるだけです。このコードの何が問題になっていますか?

using (cmd)
{
    cmd.CommandType = CommandType.StoredProcedure;
    cn.Open();
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        if (dr.HasRows)
        {
            while (dr.Read())
            {
                CountryList.Add(ParseDataReader(dr));
            }

            cn.Close();
            return CountryList;

        }
    }
}

解析メソッドは次のとおりです。

public static  Countries ParseDataReader(SqlDataReader dr)
    {
        Countries MyCountries = new Countries();

        dr.Read();

            if (dr["CountryID"]!=DBNull.Value )
            {
                MyCountries.CountryID = (int)dr["CountryID"];
            }
            if (dr["Code"]!=DBNull.Value)
            {
                MyCountries.Code = dr["Code"].ToString();
            }
            if (dr["Name"]!=DBNull.Value)
            {
                MyCountries.Name = dr["Name"].ToString();
            }
            if (dr["RequiresState"]!= DBNull.Value)
            {
                MyCountries.RequiresState = (bool)dr["RequiresState"];
            }
            if (dr["Order"]!=DBNull.Value)
            {
                MyCountries.Order = (decimal)dr["Order"];
            }

        return MyCountries;
    }

参考:ストアドプロシージャは正しい行数を返しますが、データリーダーは結果から偶数行のみを読み取ります。

4

3 に答える 3

4
public static  Countries ParseDataReader(SqlDataReader dr)
{
    Countries MyCountries = new Countries();
    //dr.Read(); // << remove this

あなたはdr.Read()二度電話しました。

于 2013-01-07T07:53:21.677 に答える
1

ParseDataReaderにはどのようなコードがありますか?dr.Read()行ごとに1回だけ呼び出す必要があり、while()で十分であることに注意してください。

于 2013-01-07T07:35:16.773 に答える
0

さて、関連するコードを表示しないでいただきありがとうございます。

明らかにこれは間違っています。DRが2行ごとに読み取るとしたら、多くの人がそれを理解するでしょう。

これが発生する可能性のある2つの方法は次のとおりです。

  • ParseDataaReaderはdr.readを作成します(したがって、行はすべての行でスキップされます)
  • ストアドプロシージャは、返すと思われるデータを返しません(したがって、考えているすべての行を送信することはありません)。

単純。

検証してください。


更新:そして、あなたはあなたが投稿したものを読むことができますか?ParseDataReaderメソッドにdr.READ呼び出しがあります。したがって、1つを放棄すると、ParseDataaReaderは1つを転送し(行をスキップ)、それを解析します。

于 2013-01-07T07:38:26.633 に答える