编辑
在盯着这个 2 天之后,我确实看到了一个问题。我仍在打开原始连接。所以我将内部的 open 语句更改为conn2.Open
. 然后,我将第二个内部查询更改为所有变量都是数字 3 而不是 2,以便它们与前一个查询完全不同。那时,我得到了错误:
已经有一个与此命令关联的打开的 DataReader,必须先关闭它。
我取出了内部连接,以为我可以使用外部连接并取出内部.Close
线路,但这也返回了一个错误,说连接没有关闭。
结束编辑
我正在编写一个脚本,该脚本使用从其他表中提取的数据更新用户信息,该用户可能多次在其中进行购买。
所以首先,“外部” sql 查询从包含购买者信息和类别信息的项目表中提取一些数据。对于每个项目,它会检查它的购买者信息。
其次,第一个“内部”sql 查询从用户表中提取类别信息。然后运行一些代码以查看它们是否已从“外部”查询的类别中标记为购买。如果不是,它会将类别添加到字符串变量中。
最后,第二个“内部”sql 查询使用新的类别列表更新当前用户的用户表。
我之前曾询问过如何执行这样的查询,但总是得到一个将查询合并为一个的解决方案。这适用于其他查询,但我不能在这里这样做。我必须遍历外部查询的每条记录以在其中执行必要的功能。但我的问题是我收到一个 SQL 错误,指出连接没有关闭,它指向外部查询的捕获(对于' conn
')。
我曾尝试设置我的 2 个内部查询,以便它们使用不同的连接变量(conn2
和conn3
),以及不同的 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();
}
}