SQL错误:连接未关闭。连接的当前状态是打开的

时间:2012-02-03 14:27:42

标签: sql inner-query

修改

盯着这两天后,我确实看到了一个问题。我还在打开原来的连接。所以我将内部开放语句更改为conn2.Open。然后,我将第二个内部查询更改为所有变量为3而不是2的位置,以便它们与上一个查询完全不同。那时,我收到了错误:

  

已经有一个与此命令关联的打开DataReader,必须先关闭它。

我取出内部连接,认为我可以使用外部连接并取出内部.Close行,但这也返回了一个错误,说连接没有关闭。

结束编辑

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

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

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

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

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

我曾尝试设置我的2个内部查询,以便他们使用不同的连接变量(conn2conn3),以及不同的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();
        }
    }

1 个答案:

答案 0 :(得分:1)

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