【发布时间】:2014-01-13 18:28:06
【问题描述】:
我正在尝试确定代码库中是否存在明显错误。
有问题的代码调用返回 IDataReader 的第三方 dll。如果代码使用 reader 而不处理它,它不会显式返回到池中,对吗?
这是调用代码:
IDataReader rdr = db.ExecSPGetDataReader("dbo.someStoredProcedure", paramList);
if (rdr.Read())
{
List<nameValuePair> formValues = Utils.nameValuePairs(rdr["valuepairs"].ToString());
foreach (nameValuePair nvp in formValues)
{
if (nvp.name.ToLower() == "name")
{
outString = nvp.value;
break;
}
}
}
这是反编译的第三方dll代码:
public IDataReader ExecSPGetDataReader(string sp, List<param> paramList)
{
IDataReader dataReader;
using (DbCommand dbC = this.setDBCommand(sp, paramList, true))
{
IDataReader dr = this._db.ExecuteReader(dbC);
this.setOutputParams(dbC, paramList);
dataReader = dr;
}
return dataReader;
}
看起来命令被释放了,可能是为了释放连接,但如果这是真的,如何从返回的 IDataReader 中读取任何内容?
【问题讨论】:
-
返回的
IDataReader是否需要保留DbCommand才能正常工作? -
只是一个旁注 - 暴露裸数据阅读器是一种可怕的设计。我不羡慕你。至少确保在读完数据后将它们丢弃。
-
@spender 这就是我的问题。我在想的是 IDataReader 挂在数据库连接上
标签: c# .net sql-server ado.net connection-pooling