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


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.