2017-07-31 113 views
1

我的問題是關於到 - 無效的嘗試時不存在數據到列表框控件在asp.net C#SqDataReader閱讀 我的代碼是:無效嘗試

SqlConnection oConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["evaConn"].ConnectionString); 
    try 
    { 
     oConn.Open(); 
     SqlCommand oCmd = new SqlCommand(); 
     oCmd.Connection = oConn; 
     oCmd.CommandText = str; 
     SqlDataReader dr = oCmd.ExecuteReader(); 
     lstLeft.DataTextField = "drname"; 
     lstLeft.DataValueField = "drid"; 
     lstLeft.DataSource = dr; 
     lstLeft.DataBind(); 
     for (int j = 0; j < lstLeft.Items.Count; j++) 
     { 
      while (dr.Read()) 
      { 
       if (dr["othermr"].ToString() == "1") 
       { 
        lstLeft.Items[j].Text = lstLeft.Items[j].Text + " (Assigned to - " + dr["mrname"].ToString() + ")"; 
       } 
      } 
     } 
     dr.Close(); 
    } 
    catch (Exception) 
    { 


    } 
    finally 
    { 
     oConn.Close(); 
     oConn.Dispose(); 
    } 

錯誤出現無效嘗試時,數據綁定列表框

+0

你爲什麼在這裏使用一個ListBox?以及你如何聲明ListBox?你能展示聲明和初始化嗎? –

+0

我在前端添加了列表框,即asp.net頁面 Shail

+0

嘗試移動for循環旁邊的'lstLeft.DataBind();'並檢查。我認爲你選擇了醜陋的方法。最好是用所需的數據創建一個列表或數據表,然後將其綁定到UI,這會很容易維護。 –

回答

0

這是不使用DataReader一個很好的做法裏面的for循環:

for (int j = 0; j < lstLeft.Items.Count; j++) 
{ 
    while (dr.Read()) 
    { 
     if (dr["othermr"].ToString() == "1") 
     { 
      lstLeft.Items[j].Text = lstLeft.Items[j].Text + " (Assigned to - " + dr["mrname"].ToString() + ")"; 
     } 
    } 
} 

注意DataReader在一個方向上運行,以便當它退出while循環時,它到達加載的數據序列的末尾,因此它不能用於在進入下一個循環時獲取不存在的記錄的值(並且返回無效嘗試讀取當沒有數據時)。

正確的方法是使用一個櫃檯裏面while循環每次數據被讀取,直到最後一個序列時間&計數:

var dr = oCmd.ExecuteReader(); 
int j = 0; 

while (dr.Read()) 
{ 
    if (dr["othermr"].ToString() == "1") 
    { 
     lstLeft.Items[j].Text = lstLeft.Items[j].Text + " (Assigned to - " + dr["mrname"].ToString() + ")"; 
    } 

    if (j == lstLeft.Items.Count) 
    { 
     break; 
    } 
    j++; // counter 
} 

我建議使用DataTable如果你仍然想使用for循環:

var dr = oCmd.ExecuteReader(); 
var dt = new DataTable(); 

dt.Load(dr); // load data into DataTable instead 

for (int j = 0; j < lstLeft.Items.Count; j++) 
{ 
    // adjust the row index number so that you can get proper values 
    if (dt.Rows[j]["othermr"].ToString() == "1") 
    { 
     lstLeft.Items[j].Text = lstLeft.Items[j].Text + " (Assigned to - " + dt.Rows[j]["mrname"].ToString() + ")"; 
    } 
} 

此外,從DataReader結合數據源服務器控件時,你應該使用DataTable(你可以重複使用它的Wi日爲環以上):

// taken from /a/14089639 
using (var oCmd = new SqlCommand(str, oConn)) 
{ 
    var dap = new SqlDataAdapter(oCmd); 
    var dt = new DataTable(); 
    dap.Fill(dt); 

    lstLeft.DataTextField = "drname"; 
    lstLeft.DataValueField = "drid"; 
    lstLeft.DataSource = dt; 
    lstLeft.DataBind(); 
} 

請注意,您不需要使用oCmd.ExecuteReader()兩次,如果在第一階段你已經把裏面DataTableDataReader內容。

參考:

How to fill listBox Control?

+0

謝謝,它的工作很好。 – Shail

0

Shail, 對我之後沒有數據存在於 asp.net C#中列表框閱讀,你的閱讀器變空(但不能爲null)後你用Listbox綁定它。 所以,如果你改變你的代碼像下面,我希望它會爲你工作:

SqlConnection oConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["evaConn"].ConnectionString); 
try 
{ 
    oConn.Open(); 
    SqlCommand oCmd = new SqlCommand(); 
    oCmd.Connection = oConn; 
    oCmd.CommandText = str; 
    SqlDataReader dr = oCmd.ExecuteReader(); 
    lstLeft.DataTextField = "drname"; 
    lstLeft.DataValueField = "drid"; 
    lstLeft.DataSource = dr; 
    lstLeft.DataBind(); 
    dr.Close();//Close dr here 
    dr = oCmd.ExecuteReader();//fill it again here 
    for (int j = 0; j < lstLeft.Items.Count; j++) 
    { 
     while (dr.Read()) 
     { 
      if (dr["othermr"].ToString() == "1") 
      { 
       lstLeft.Items[j].Text = lstLeft.Items[j].Text + " (Assigned to - " + dr["mrname"].ToString() + ")"; 
      } 
     } 
    } 
    dr.Close(); 
} 
catch (Exception) 
{ 


} 
finally 
{ 
    oConn.Close(); 
    oConn.Dispose(); 
} 
相關問題