0

编辑

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

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

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

结束编辑

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

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

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

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

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

我曾尝试设置我的 2 个内部查询,以便它们使用不同的连接变量(conn2conn3),以及不同的 strSQL 变量,但这没有帮助。而且我仍然是 SQL 的新手,在这个 probject 之前一直使用 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 回答