2009-07-18 3 views
56
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 [email protected]"); 
     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. Это не возможно, как у меня есть данные в таблице с именем = sumant. Пожалуйста, сообщите мне, является ли утверждение «если» правильным или нет .........Неверная попытка чтения при отсутствии данных присутствует

И как удалить ошибку ??

ответ

128

Вы должны вызвать DataReader.Read, чтобы получить результат:

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

DataReader.Read() возвращает bool, указывающий, если есть более блоков данных для чтения, поэтому если у вас есть более чем 1 результат, вы можете сделать:

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

кроме того, вы можете захотеть попробовать данные утратившими используя dr.IsBDNull (0) –

+0

Этот ответ может быть улучшена, первый фрагмент кода не заботиться о возвращаемое значение 'dr.Read()'. Поэтому, если запрос не возвращает записи, ошибка будет такой же: «Неверная попытка прочитать, когда данных нет». Вместо этого используйте 'if (dr.Read()) {....}' (или цикл, как показано ниже). –

13

Прежде чем приступать к чтению любых данных, вы должны позвонить dr.Read(). Этот метод вернет false, если читать нечего.

6

Я хотел бы проверить, чтобы увидеть, если SqlDataReader есть строки, возвращаемые первый:

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

в моем случае у меня было это, и хотя я использовал это в другом месте, в этом конкретном сценарии, вызвавшем эту ошибку, это НЕ остановило ошибку от барботажа. У моего результирующего запроса есть строки, и все же у читателя нет данных. Я действительно не понимаю, что происходит. Проверял сам запрос и параметры. – Barry

6

У меня была эта ошибка, я звонил dr.NextResult() вместо dr.Read().

+1

просто было то же самое! Это был ужасный час! –

1

Я использовал код ниже, и это сработало для меня.

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

String To=email; 
0

У меня было 2 значения, которые могут содержать нулевые значения.

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

решен вопрос

Смежные вопросы