是使用相同的变量不同调用静态方法
问题描述:
我有这样的方法:是使用相同的变量不同调用静态方法
public static IEnumerable<T> ExecuteReaderSp<T>(string sp, string cs, object parameters) where T : new()
{
using (var conn = new SqlConnection(cs))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp;
cmd.InjectFrom<SetParamsValues>(parameters);
conn.Open();
using (var dr = cmd.ExecuteReader())
while (dr.Read())
{
var o = new T();
o.InjectFrom<ReaderInjection>(dr);
yield return o;
}
}
}
}
我的情况时,我把它叫倍(使用不同的T和SP)一“交易范围”内
,如果我不上拳头电话呼叫.ToArray()
比我以前告诉我,这个命令已经与另一个相关联的DataReader和第一个应该首先关闭错误
答
因为它是在一个事务范围内,我敢肯定,ADO.Net被提供到数据库的同一物理连接,但我认为命令已经被相关是一个红色的鲱鱼的文字 - 尝试将MultipleActiveResultSets=True
添加到您的连接字符串中。
您在这里遇到的情况是yield return
的功能,直到IEnumerable
对象完全行走才会被完全评估 - 并且默认情况下,SqlConnections一次只允许一个DataReader对其激活。
此外,我赞扬您正确使用使用语句 - 但请注意,除非您走完整个IEnumerable
,否则任何内容都不会被废弃。 (这是ToArray()
正在为你做的一切工作。)