SQL错误:连接未关闭。连接';它的当前状态是开放的

SQL错误:连接未关闭。连接';它的当前状态是开放的,sql,inner-query,Sql,Inner Query,编辑 在看了两天之后,我确实看到了一个问题。我仍在打开原始连接。因此,我将内部open语句更改为conn2.open。然后,我将第二个内部查询更改为所有变量都是数字3而不是2,这样它们与前一个查询完全不同。在这一点上,我得到了一个错误: 已存在与此命令关联的打开的DataReader,必须先关闭该命令 我取出了内部连接,认为可以使用外部连接,取出了内部.Close行,但这也返回了一个错误,表示连接未关闭 结束编辑 我正在编写一个脚本,该脚本使用从其他表中提取的数据更新用户信息,在这些表中,用户可

编辑

在看了两天之后,我确实看到了一个问题。我仍在打开原始连接。因此,我将内部open语句更改为
conn2.open
。然后,我将第二个内部查询更改为所有变量都是数字3而不是2,这样它们与前一个查询完全不同。在这一点上,我得到了一个错误:

已存在与此命令关联的打开的DataReader,必须先关闭该命令

我取出了内部连接,认为可以使用外部连接,取出了内部
.Close
行,但这也返回了一个错误,表示连接未关闭

结束编辑

我正在编写一个脚本,该脚本使用从其他表中提取的数据更新用户信息,在这些表中,用户可能多次在其中进行购买

因此,首先,“外部”sql查询从items表中提取一些数据,该表包含购买者信息和类别信息。对于每个项目,它都将检查其采购商的信息

第二,第一个“内部”sql查询从用户表中提取类别信息。然后运行一些代码,查看它们是否已标记为“外部”查询类别中的“采购”。如果不是,则将类别添加到字符串变量中

最后,第二个“内部”sql查询使用新的类别列表更新当前用户的用户表

我以前问过如何执行这样的查询,但总是得到一个将查询组合成一个查询的解决方案。这对其他查询有效,但我不能在这里这样做。我必须遍历外部查询的每条记录,以在其中执行必要的函数。但我这里的问题是,我得到一个SQL错误,说连接没有关闭,它指向外部查询的捕获(对于“
conn
”)

我试图设置我的两个内部查询,以便它们使用不同的连接变量(
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();
        }
    }

conn.Open()有一些不寻常的逻辑。我看到它被使用了好几次,但我认为您的意思是在第一次调用后在内部using语句中使用conn2.Open()。

没有全部阅读,但是您不应该在第一次
使用
后不久
打开
您的
conn
?你还不止一次开了康涅狄格州@vulkanino在7号线开通。我总是这样安排的。它在其他任何时候都可以正常工作,只是现在它说它不会因为这些内部查询而关闭。我从原始查询返回4个字段。我将查看数据表。我以前没这么做过,就像瓦卡尼诺说的。我最初的分析错误地建议使用dataadapter(这仍然是消除多个连接/多个打开的DataReader的一个不错的选择),但在我意识到vulkanino在说什么之前,我发布了我更正的重复答案。是的,我在vulkanino编辑他的评论之前就意识到了这一点。我已经改变了,没有真正的改变。在第一次打开conn2之后,您仍然在打开第一个strSQL。它还需要更改为strSQL2.:)@Hadmacker完全正确。我盯着这个看太久了。现在我得到了一个实际的SQL语法错误。我认为我们走对了方向。让我来修一下,我会和你回去的。谢谢你的帮助。