2015-05-27 31 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

@羅曼什麼是你的下一個問題 – 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

在這裏我的下一個問題:[link](http://stackoverflow.com/questions/30473331/invalid-attempt-to-read-when-no- data-is-present#comment49027342_30473390) – Roman

+0

@Roman您可以在代碼中顯示您爲kodProd.Id和SorterKod賦值的代碼 – Sachu

5

您可以檢查的DataReader是否準備好取行

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,但是在您的問題中給出的代碼中,使用Order By。告訴我你爲什麼使用Order By排序過濾器。其含義較少 –

1

相信會實際發生的錯誤下一行,即通過索引[]操作員訪問閱讀器。什麼,你需要做的是訪問它之前檢查的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{} 

編輯:對不起,壞的格式,從Android應用程序發佈的代碼是一個爛攤子。

編輯:請參閱Microsoft示例here

相關問題