c#-如果不处理IDataReader,我的连接是否返回到池中?
作者:互联网
我正在尝试确定代码库中是否存在明显错误.
有问题的代码调用返回IDataReader的第三方dll.如果代码在不处理的情况下使用读取器,则不会将其显式返回到池中,对吗?
这是调用代码:
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中读取任何内容?
解决方法:
If the code uses the reader without disposing of it, it won’t be explicitly returned to the pool, correct?
那是对的.将代码更改为此:
using (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;
}
}
}
}
using语句将确保调用Dispose.
标签:ado-net,connection-pooling,c,net,sql-server 来源: https://codeday.me/bug/20191030/1964367.html