0

Visual Studio 2010 で Visual C# アプリケーションを使用しています。フォームに 2 つの listBox があります。最初のものには ID が含まれており、2 番目のものには番号が含まれており、これらはすべて私が作成したデータベースに保存されています。ボタンもあり、ボタンがクリックされたときに、最初の listBox に表示される 1 つの ID ごとにデータベースの列の 1 つを更新し、それらすべての ID を残りの列と共に別のテーブルに保存します。私のデータベースの。

最初の部分 (listBox に表示されるすべての ID の列の 1 つを更新する) は成功しましたが、2 番目の部分を機能させることができません。クエリを実行するまで待機する必要があると誰かに言われましたが、それによってアプリケーションが遅くなることはありませんか? また、私はそれを行う方法がわかりません。

私が間違っていなければ、問題は私が使用しているループ内のループです。

   if (listBox1.Items.Count > 0)
        {
            string kat1 = "Μοριοδοτηθείσα";
            cmd.CommandText = "UPDATE Table2 SET kat_aitisis=@kat WHERE aitisi_ID=@id";

            cmd.Parameters.AddWithValue("@kat", kat1);
            cmd.Parameters.AddWithValue("@id", 0);

            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                cn.Open();
                cmd.Parameters["@id"].Value = Convert.ToInt32(listBox1.Items[i]);
                cmd.ExecuteNonQuery();
                cmd.Clone();

                cmd.CommandText = "select * from Table2 WHERE aitisi_ID=@id";

                        dr = cmd.ExecuteReader();
                        if (dr.HasRows)
                        {
                            while (dr.Read())
                            {

                                 cmd1.CommandText = "Insert INTO Table3 (aitisi_ID,imerominia_aitisis,Epwnimo,Onoma,ADT,Poli,TK,Address,Telephone,email,username,password,IEK,Eidikotita,oikogen_kat,erg_gon,erg_spoy,eisodima_gon,eisodima_spoy,moria) values (dr[0],dr[1],dr[2],dr[3],dr[4],dr[5],dr[6],dr[7],dr[8],dr[9],dr[10],dr[11],dr[12],dr[13],dr[14],dr[15],dr[16],dr[17],dr[18],dr[19])";
                                 cmd1.ExecuteNonQuery();
                                 cmd.Clone();


                            }
                        }
                 cn.Close();
            }


            MessageBox.Show("blahblah.");

        }
4

3 に答える 3

2

SqlDataReader が開いている間、そのインスタンスが使用する接続を他のデータ アクセス コマンドに再利用することはできません。内部ループでは、接続が DataReader の処理でビジーであるため、コマンドを実行できません。

問題を解決するには、接続文字列を変更して文字列を追加する必要があります

"MultipleActiveResultSets=True;"

複数のアクティブな結果セットに関する MSDN を参照してください

MARS 接続を有効にする方法の例の接続文字

編集

if (listBox1.Items.Count > 0)
{
    SqlCommand cmd = new SqlCommand("UPDATE Table2 SET kat_aitisis=@kat WHERE aitisi_ID=@id";, cn);
    string kat1 = "Μοριοδοτηθείσα";
    cmd.Parameters.AddWithValue("@kat", kat1);
    cmd.Parameters.AddWithValue("@id", 0);

    SqlCommand cmd1 = new SqlCommand("select * from Table2 WHERE aitisi_ID=@id", cn);
    cmd1.Parameters.AddWithValue("@id", 0);

    SqlCommand cmd2 = new SqlCommand("INSERT INTO .......",cn);
    cmd2.Parameters.AddWithValue(.....);
    ... add the remainung cmd2.Parameters...... 

    for (int i = 0; i < listBox1.Items.Count; i++)
    {
         cn.Open();
         cmd.Parameters["@id"].Value = Convert.ToInt32(listBox1.Items[i]);
         cmd.ExecuteNonQuery();

         dr = cmd1.ExecuteReader();
         cmd1.Parameters["@id"].Value = Convert.ToInt32(listBox1.Items[i]);
         while (dr.Read())
         {
             ..set the cmd2 parameters values ...
             cmd2.ExecuteNonQuery();
         }
         MessageBox.Show("blahblah.");
    }
于 2013-05-30T16:39:46.390 に答える