1

返された SQL からの行があることをリーダーが示しているように見えるが、リーダーの while ループが実行されないという問題があります。検証としてreader.hasrowsにメッセージボックスを入れ、whileループの後の最初の行にもメッセージボックスを入れました。hasrows のメッセージ ボックスは実行されますが、Read のメッセージ ボックスは実行されません。とても不可解です。データベースに対してクエリを実行したところ、実際に行が返されました。これがコードスニペットです。

using (DbConnection connection = CADBase.DbProviderFactory.CreateConnection())
    {
        connection.ConnectionString = CADBase.DbConnectionString;
        connection.Open();

        using (DbCommand command = connection.CreateCommand())
        {
            SQL = <statement here>;
            command.CommandText = SQL

            using (DbDataReader reader = command.ExecuteReader())
            {
                    while (reader.Read())
                    {
            //NEVER MAKES IT HERE
                    } 
    }
        }
    }
4

5 に答える 5

2

この質問の将来の読者へ:OPがクエリであまりにも多くの列を返すために問題が発生したことに注意してください。この回答の下のコメントを参照してください。


なぜこれが起こっているのかよくわかりませんが、実際には、行を 2 回ではなく 1 回だけチェックする必要があり、Read()メソッドは既にこれを行っています。

本当に必要なのは

while (reader.Read())
{
    // Do your thing
} 
于 2012-12-12T15:45:44.343 に答える
0

推測です。おそらく、reader.HasRows の後、reader.Read() の前に表示されるメッセージ ボックス内のリーダー オブジェクトにアクセスしています。どうやら Read() メソッドは、リーダーが最後の行に到達していない場合にのみ true を返します ( https://stackoverflow.com/a/1540626/516481を参照)。したがって、リーダーが最後の行にある場合、false が返されます! おそらく、クエリが 1 行だけを返し、リーダー オブジェクトにアクセスして (おそらくデバッガーを使用して) リーダー オブジェクトの内部状態を変更し、リーダーを最後の行に移動しますか?

于 2012-12-12T16:25:55.393 に答える
0

最初に read を呼び出す前に MoveNext() を呼び出します

于 2012-12-12T15:46:19.167 に答える
0

メソッドではなく、reader.HasRows プロパティを使用する必要があります。

于 2012-12-12T15:47:07.213 に答える
0

で例外が発生している可能性がありますreader.Read()

しかし、それHasRowsはメソッドではなくプロパティです。if(reader.HasRows)コンパイルするには、書く必要があります。

if(reader.HasRows)
{           
    //MAKES IT HERE   
    while (reader.Read())
    {
        //NEVER MAKES IT HERE
    } 
} 

だから私は実際のコードが何であるか疑問に思っています。

于 2012-12-12T15:48:23.610 に答える