Неправильна спроба читання, коли немає даних


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. Це неможливо, оскільки я маю дані в таблиці з username = sumant. Скажіть, будь ласка, чи правильне твердження "якщо" .........

І як мені видалити помилку ??

Відповіді:


176

Вам потрібно зателефонувати, 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)
Луїс Роблес

Цю відповідь можна покращити, перший фрагмент не дбає про повернене значення dr.Read(). Отже, якщо запит не повертає записи, помилка збігається: "Неправильна спроба читання, коли відсутні дані". Натомість використовуйте if(dr.Read()){....}(або цикл, як показано нижче).
Тім Шмельтер

17

Вам потрібно зателефонувати dr.Read()перед спробою прочитати будь-які дані. Цей метод поверне false, якщо нема чого читати.


9

У мене просто виникла ця помилка, я телефонував dr.NextResult()замість dr.Read().


1
просто мали те саме саме! Це була розчарувальна година!
JonnyRaa,

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

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

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

вирішив питання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.