web-dev-qa-db-ja.com

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

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

そして、どのようにエラーを削除しますか?

71
knowledgehunter

_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
}
_
160
Julien Poulin

データを読み取る前に、dr.Read()を呼び出す必要があります。読み取るものがない場合、そのメソッドはfalseを返します。

17
Colin Mackay

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

9
Charlie

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

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

以下のコードを使用しましたが、うまくいきました。

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

String To=email;
3
Aneel Goplani

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

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

問題を解決しました

1
Dev