データが存在しない場合の無効な読み取り試行


80
    private void button1_Click(object sender, EventArgs e)
    {
        string name;
        name = textBox5.Text;
        SqlConnection con10 = new SqlConnection("con strn");
        SqlCommand cmd10 = new SqlCommand("select * from sumant where username=@name");
        cmd10.Parameters.AddWithValue("@name",name);
        cmd10.Connection = con10;
        cmd10.Connection.Open();//line 7
        SqlDataReader dr = cmd10.ExecuteReader();
    }

    if ( textBox2.Text == dr[2].ToString())
    {
        //do something;
    }

7行目までデバッグするInvalid attempt to read when no data is present. と問題ありませんが、その後drは例外をスロー します。username= sumantのテーブルにデータがあるため、これは不可能です。'if'ステートメントが正しいかどうか教えてください........。

そして、どうすればエラーを取り除くことができますか?

回答:


176

DataReader.Read結果を取得するには、を呼び出す必要があります。

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read()) 
{
    // read data for first record here
}

DataReader.Read()bool読み取るデータのブロックがまだあるかどうかを示すを返すため、結果が複数ある場合は、次の操作を実行できます。

while (dr.Read()) 
{
    // read data for each record here
}

4
それ以外に、dr.IsBDNull(0)を使用してデータがnullになるようにすることをお勧めします
ルイスロブレス

この答えは改善される可能性があり、最初のスニペットはの戻り値を処理しませんdr.Read()。したがって、クエリがレコードを返さない場合、エラーは同じです:「データが存在しないときに無効な読み取りを試みます」。代わりにif(dr.Read()){....}(または以下のようなループ)を使用してください。
ティムシュメルター2014

17

dr.Read()データを読み取ろうとする前に、電話をかける必要があります。読み取るものがない場合、そのメソッドはfalseを返します。


9

このエラーが発生しました。dr.NextResult()代わりに呼び出していましたdr.Read()


1
まったく同じものがありました!それはイライラする時間でした!
JonnyRaa 2014年

8

SqlDataReaderの行が最初に返されるかどうかを確認します。

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}

4
私の場合、これがあり、他の場所でこれを使用していましたが、このエラーが発生したこの特定のシナリオでは、エラーのバブリングが停止しませんでした。結果のクエリには行がありますが、リーダーにはデータがありません。何が起こっているのか本当にわかりません。クエリとパラメータを自分で確認しました。
バリー

3

私は以下のコードを使用しました、そしてそれは私のために働きました。

String email="";
    SqlDataReader reader=cmd.ExecuteReader();
    if(reader.Read()){
        email=reader["Email"].ToString();
    }

String To=email;

2

null値を含む可能性のある2つの値がありました。

while(dr.Read())
 {
    Id = dr["Id"] as int? ?? default(int?);
    Alt =  dr["Alt"].ToString() as string ?? default(string);
    Name = dr["Name"].ToString()
 }

問題を解決しました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.