【发布时间】:2012-11-19 14:36:11
【问题描述】:
我有以下代码(为了便于阅读,这里使用伪值),其中第一个连接返回大量数据(数千行)。 SqlDataReader 通过reader.Read() 将它们一一读取,然后打开一个新连接以更新每一行的新值:
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand("sp1", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", param1);
cmd.Connection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
try
{
string hash= utils.SHA256.Hashing((string)reader["firstRow"], saltValue);
using (SqlConnection conn2 = new SqlConnection(connString))
using (SqlCommand cmd2 = new SqlCommand("sp2", conn2))
{
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.AddWithValue("@param1", param1);
cmd2.Parameters.AddWithValue("@param2", param2);
cmd2.Connection.Open();
cmd2.ExecuteNonQuery();
}
}
catch (SqlException ex)
{
//something
}
}
}
}
但它会引发错误:
[InvalidOperationException: Invalid attempt to call Read when reader is closed.]
System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) +640
System.Data.SqlClient.SqlDataReader.Read() +9
在开发环境中它工作正常,但这里只有几百行。它立即抛出错误,所以它看起来不像是某种超时,但是嘿 - 我不知道......
【问题讨论】:
-
调用 Read on reader 时。 while (reader.Read())
-
你能在你的第一个 SPROC 中用 SQL 做这个吗?
-
这段代码看起来不错,一定有你遗漏的东西。执行它的用户是否可能没有权限或类似的东西?
-
在 SQL 中执行此操作?临时不,因为散列是用一些库动态创建的......
-
用户拥有正确的权限。在同一页面上,我使用相同的连接字符串和相同的设置做一些其他的事情。用户是拥有所有 SP 权限的 SA