2017-07-31 13 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をどのように宣言していますか?宣言と初期化を表示できますか? –

+0

フロントエンド側のリストボックスasp.netページ Shail

+0

forループの隣に 'lstLeft.DataBind();'を移動してチェックしてみてください。私はあなたが醜いアプローチを選んだと思う。必要なデータを使ってリストやデータテーブルを作成し、単純にUIにバインドしておくと、保守性が向上します。 –

答えて

0

これは、forループの内側DataReaderを使用することをお勧めではありません。

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ループを終了するときに、ロードされたデータシーケンスの終わりに達したため、次のループに進んだときに存在しないレコードの値を取得するために使用できません(そして、を返します)データがない場合)。私はあなたがまだforループを使用したい場合はDataTableを使用することをお勧めします

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 
} 

正しい方法はwhileループ内&カウントすべてのデータが最後のシーケンスまで読み込まれた時間をカウンタを使用しています

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を再利用することができます目以上)、forループ:最初の段階ですでにDataTableDataReader内容を入れている場合は、二回oCmd.ExecuteReader()を使用する必要はありません

// 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(); 
} 

注意。

参考:あなたがここにリストボックスを使用しているのはなぜ

How to fill listBox Control?

+0

ありがとう、その仕事は大丈夫です。 – Shail

0

Shail、 にデータを結合した後 のasp.net C#でボックスをリストに存在しない場合、あなたのリーダーが空(ただし、nullではない)になっ読むために無効な試みが来た後、リストボックスでバインドします。 だから、あなたは以下のようなコード変更した場合、私はそれはあなたのために働くことを願っています:

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(); 
} 
関連する問題