0

編集

これを 2 日間見つめた後、1 つの問題が見つかりました。私はまだ元の接続を開いていました。そこで、内部の open ステートメントを に変更しましたconn2.Open。次に、2 番目の内部クエリを、すべての変数が 2 ではなく 3 になるように変更して、前のクエリとは完全に異なるようにしました。その時点で、次のエラーが発生しました。

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります。

外側の接続を使用できると思って内側の接続を取り出し、内側の.Close線を取り出しましたが、接続が閉じられていないというエラーも返されました。

編集終了

私は、ユーザーが購入のために複数回そこにいる可能性がある他のテーブルから取得したデータでユーザー情報を更新するスクリプトを書いています。

最初に、「外部」の sql クエリは、購入者情報とカテゴリ情報を含む items テーブルからいくつかのデータを取得します。商品ごとに、購入者情報を確認します。

次に、最初の「内部」SQL クエリがユーザー テーブルからカテゴリ情報を取得します。次に、いくつかのコードを実行して、「外部」クエリのカテゴリからの購入として既にマークされているかどうかを確認します。そうでない場合は、カテゴリを文字列変数に追加します。

最後に、2 番目の「内部」SQL クエリは、現在のユーザーのユーザー テーブルを新しいカテゴリ リストで更新します。

以前にこのようなクエリを実行する方法について尋ねたことがありますが、クエリを 1 つに結合するという解決策が常に与えられました。他のクエリではうまくいきましたが、ここではできません。外部クエリの各レコードを反復処理して、内部で必要な機能を実行する必要があります。しかし、ここでの問題は、接続が閉じられていないことを示す SQL エラーが発生し、外部クエリ (' ') のキャッチを指していることconnです。

2 つの内部クエリを設定して、異なる接続変数 (conn2およびconn3) と異なる strSQL 変数を使用しようとしましたが、それは役に立ちませんでした。そして、SQLに関しては、私はまだ初心者であり、このプロジェクトまでMySQLを使用してプログラミングしていました。どんな助けでも大歓迎です。

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
    using (SqlCommand strSQL = conn.CreateCommand())
    {
        strSQL.CommandText = "SELECT field FROM itemsTable";
        try
        {
            conn.Open();
            using (SqlDataReader itemReader = strSQL.ExecuteReader())
            {
                while (itemReader.Read())
                {
                    {Do some stuff here}

                    using (SqlConnection conn2 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
                    using (SqlCommand strSQL2 = conn2.CreateCommand())
                    {
                        strSQL2.CommandText = "SELECT fields FROM userTable";
                        try
                        {
                            conn2.Open();
                            using (SqlDataReader itemReader2 = strSQL2.ExecuteReader())
                            {
                                while (itemReader2.Read())
                                {
                                    {Do stuff here}
                                }
                                itemReader2.Close();
                            }
                        }
                        catch (Exception e3)
                        {
                            throw new Exception(e3.Message);
                        }
                        finally
                        {
                            conn2.Close();
                        }
                    }

                    {Do some more stuff here}

                    using (SqlConnection conn2 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
                    using (SqlCommand strSQL2 = conn2.CreateCommand())
                    {
                        strSQL2.CommandText = "UPDATE userTable set field='value'";
                        try
                        {
                            conn2.Open();
                            strSQL2.ExecuteNonQuery();
                        }
                        catch (Exception e2)
                        {
                            throw new Exception(e2.Message);
                        }
                        finally
                        {
                            conn2.Close();
                        }
                    }

                    {Do even more stuff here.}
                }

                itemReader.Close();
            }
        }
        catch (Exception e1)
        {
            throw new Exception(e1.Message);
        }
        finally
        {
            conn.Close();
        }
    }
4

1 に答える 1

1

conn.Open() で行われているいくつかの異常なロジックがあります。何度か使用されているようですが、最初の呼び出しの後に内側の using ステートメントで conn2.Open() を使用するつもりだと思います。

于 2012-02-03T14:37:06.487 に答える