데이터가 없을 때 잘못된 읽기 시도


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 행까지 디버그하면 괜찮지 만 그 후에 dr은 예외를 발생시킵니다. Invalid attempt to read when no data is present. 던집니다. 사용자 이름 = sumant 인 테이블에 데이터가 있으므로 불가능합니다. 'if'문구가 맞는지 알려주세요 .........

그리고 어떻게 오류를 제거합니까 ??

답변:


176

DataReader.Read결과를 가져 오려면 호출 해야합니다.

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

DataReader.Read()bool읽을 데이터 블록이 더 있는지 여부를 나타내는를 반환 하므로 결과가 2 개 이상이면 다음을 수행 할 수 있습니다.

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

4
데이터가 (0) dr.IsBDNull 사용하여 널 (null)이 될 수 있도록 그 외에, 당신은 시도 할 수 있습니다
루이스로 블스

이 답변은 개선 될 수 있습니다. 첫 번째 스 니펫은의 반환 값을 처리하지 않습니다 dr.Read(). 따라서 쿼리가 레코드를 반환하지 않으면 오류는 동일합니다. "데이터가 없을 때 잘못된 읽기 시도"입니다. 대신 사용하십시오 if(dr.Read()){....}(또는 아래와 같은 루프).
Tim Schmelter 2014 년

17

dr.Read()데이터를 읽기 전에 호출 해야합니다. 읽을 것이 없으면이 메서드는 false를 반환합니다.


9

이 오류가 발생했습니다 . dr.NextResult()대신 dr.Read().


1
똑같은 일이 있었어요! 답답한 시간이었습니다!
JonnyRaa 2014

8

SqlDataReader에 먼저 반환 된 행이 있는지 확인합니다.

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

4
제 경우에는 이것을 가지고 있었고 다른 곳에서 이것을 사용했지만이 오류를 생성 한이 특정 시나리오에서 이것이 오류가 버블 링되는 것을 막지는 못했습니다. 내 쿼리 결과에는 행이 있지만 독자에게는 데이터가 없습니다. 나는 정말로 무슨 일이 일어나고 있는지 이해하지 못한다. 쿼리 및 매개 변수를 직접 확인했습니다.
Barry

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.