2015-05-27 2 views
0

Это мой код:Неверная попытка чтения при отсутствии данных присутствует

db.Open(); 

string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE [email protected] AND [email protected] AND moved_ok IS NULL ORDER BY CAST(kol as int)"; 
try 
{ 
    SqlCommand command = new SqlCommand(updateString, db); 
    //command.Parameters.AddWithValue("@numdoc", NumDoc); 
    command.Parameters.AddWithValue("@kodprod", KodProd.Id); 
    command.Parameters.AddWithValue("@sorter", SorterKod); 
    SqlDataReader reader = command.ExecuteReader(); 
    reader.Read();//here error 
    Kol = reader["kol"].ToString(); 
    Adres = reader["adres"].ToString(); 
    NumWave = reader["numwave"].ToString(); 
    NumDoc = reader["numdoc"].ToString(); 
    reader.Close(); 
    } 
    catch (Exception ex) 
    { } 

Почему я получаю эту ошибку, когда я запускаю мой код ?:

недействительная попытка читать, когда нет данных имеется

+0

Вы получаете ошибку во время компиляции или выполнения? – Amit

+0

Не связано с ошибкой, но похоже, что вы набрали слово «Адрес». Вы можете получить сообщение об ошибке, если оно правильно написано в базе данных. Если в будущем не возникнет путаницы. – Dzyann

+0

@Roman whats ваша следующая проблема – Sachu

ответ

0

вы должны сделать while loop, чтобы проверить, содержат ли данные данные. Вы также можете использовать IF, если вы уверены, что запрос возвращает только одну строку. Если несколько строк, вы должны использовать While. В вашем случае IF также сделать работу, потому что вы только принимая TOP1

string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, 
         RTRIM(numwave) numwave FROM sorters WHERE 
         [email protected] AND [email protected] 
         AND moved_ok IS NULL ORDER BY CAST(kol as int)"; 
       try 
       { 
        SqlCommand command = new SqlCommand(updateString, db); 
        //command.Parameters.AddWithValue("@numdoc", NumDoc); 
        command.Parameters.AddWithValue("@kodprod", KodProd.Id); 
        command.Parameters.AddWithValue("@sorter", SorterKod); 
        SqlDataReader reader = command.ExecuteReader(); 
        while(reader.Read()) 
        { 
        Kol = reader["kol"].ToString(); 
        Adres = reader["adres"].ToString(); 
        NumWave = reader["numwave"].ToString(); 
        NumDoc = reader["numdoc"].ToString(); 
        } 
        reader.Close(); 
       } 
+0

@downvoter вы можете рассказать причину – Sachu

+0

здесь моя следующая проблема: [ссылка] (http://stackoverflow.com/questions/30473331/invalid-attempt-to-read-when-no- data-is-present # comment49027342_30473390) – Roman

+0

@Roman вы можете показать код, где вы оцениваете значение для kodProd.Id и SorterKod – Sachu

5

Вы можете проверить, готов ли извлечь строки

if(reader.HasRows) 
{ 
    //do the coding here 
} 
+0

Хорошо, эта проблема решена) Tnx. Но теперь у меня есть следующая проблема. – Roman

+0

Мой запрос работает неправильно. Здесь мои колонки таблицы: [ссылка] (http://s7.hostingkartinok.com/uploads/images/2015/05/24853a7a8aa89bb9d99f04432a5ba28e.png) Здесь запрос в SQL: [ссылка] (http: // s7. hostingkartinok.com/uploads/images/2015/05/a003be01635a074900c5f5aa6dd801f1.png) В C# его возвращение 0 Строки – Roman

+0

В SQL-ссылке вы предоставили запрос без какого-либо Order By, но в коде, указанном в вашем вопросе , Используется заказ By. Скажите мне, почему вы использовали Order By для Top 1 row filter. Его значение меньше –

1

Я считаю, что ошибка на самом деле происходит на DataReader следующая строка, а именно, когда вы получаете доступ к считывателю с помощью индекса [] оператора. Что вам нужно сделать, это проверить результат reader.Read() перед доступом к ней:

if (reader.Read()) 
{ 
    Kol = reader["kol"].ToString(); 
    Adres = reader["adres"].ToString(); 
    NumWave = reader["numwave"].ToString(); 
    NumDoc = reader["numdoc"].ToString(); 
} 

Поскольку вы только возвращает максимум один ряд (TOP 1) там будет либо ноль или один строк.

0

Использование reader.HasRows

string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE [email protected] AND [email protected] AND moved_ok IS NULL ORDER BY CAST(kol as int)"; 
try 
{ 
SqlCommand command = new SqlCommand(updateString, db); 
//command.Parameters.AddWithValue("@numdoc", NumDoc); 
command.Parameters.AddWithValue("@kodprod", KodProd.Id); 
command.Parameters.AddWithValue("@sorter", SorterKod); SqlDataReader 
reader = command.ExecuteReader(); 
if(reader.HasRows) 
while(reader.Read())//here error 
{ 
Kol = reader["kol"].ToString(); 
Adres = reader["adres"].ToString(); 
NumWave = reader["numwave"].ToString(); 
NumDoc = reader["numdoc"].ToString(); 
} 
reader.Close(); 
} 
catch{} 

EDIT: извините за плохое форматирование, размещая код из Android приложения беспорядок.

EDIT: Смотрите пример Microsoft here

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