2017-04-16 4 views
0

私は記事名と2つのテキストボックスのコンボボックスを含むtablelayoutpanelを1つは量用、もう1つはアーティクルのfinalpriceを表示するためには、 finalprice(価格*数量)が、私は得るすべての例外「このコマンドでassocietedのDataReaderはそれが最初に閉じる必要があります、既に開いている」が、閉じられたすべての読者である:/このコマンドに関連付けられているデータレアが既に開いている場合は、最初に閉じる必要があります

private void txtQ2_TextChanged(object sender, EventArgs e) 
    { 
     if (sqlCon.State == ConnectionState.Closed) 
      sqlCon.Open(); 
     try { 
      int q = tableLayoutPanel1.GetRow((TextBox)sender); 
      ComboBox q1 = (ComboBox)tableLayoutPanel1.GetControlFromPosition(0, q); 
      String NameArt = q1.Text; 
      SqlCommand cmd2 = new SqlCommand("select PriceArticle from tbl_article where NameArticle='" + NameArt + "'", sqlCon); 
      SqlDataReader dr1 = cmd2.ExecuteReader(); 
      if(dr1.Read()) 
      { 
       int x = tableLayoutPanel1.GetRow(q1); 
       TextBox y1 = (TextBox)tableLayoutPanel1.GetControlFromPosition(1, x); 
       int z; 
       bool parseOK1 = Int32.TryParse(y1.Text, out z); 
       String a = dr1["PriceArticle"].ToString(); 
       int j; 
       bool parseOK2 = Int32.TryParse(a, out j); 
       int w = j * z; 
       TextBox y2 = (TextBox)tableLayoutPanel1.GetControlFromPosition(2, x); 
       y2.Text = w.ToString(); 
      } 
      dr1.Close(); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error"); 
     } 
    } 
+0

なぜグローバル接続オブジェクトを保持しますか。これがあなたの問題の原因です。ローカル接続を使用して開き、使用し、閉じて処分します。あなたのコードのどこかにもうデータリーダーが残っていません。 – Steve

+0

このコードは、SQLインジェクション攻撃に対して脆弱です。 –

答えて

0

エラーが示すように:別の操作がまだ開いています。最後のクエリが何であったとしても、あなたはきれいにそれを閉じなかった。 DbCommandDbDataReaderのオブジェクトはIDisposableなので、usingにする必要があります。問題のコードの場合:

using(var cmd2 = new SqlCommand("select PriceArticle from tbl_article where NameArticle='" + NameArt + "'", sqlCon)) 
using(var dr1 = cmd2.ExecuteReader()) 
{ 
    // the rest of the code 
} 

また、ほとんどあなたがSQLへの入力を連結したことがないんであることは言うまでもない、とあなたのSQLはSQLインジェクションに巨大に開かれています。パラメータに切り替えるか、 "dapper"のように正しく動かすのに役立つツールに切り替えてください。例:

// via "dapper" 
var article = sqlCon.QuerySingleOrDefault<string>(
    "select PriceArticle from tbl_article where [email protected]", 
    new { NameArt }); 
if(article != null) 
{ 
    ... 
} 
関連する問題

 関連する問題