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