我正在尝试确定代码库中是否存在明显的错误。
有问题的代码调用第三方dll,它返回一个IDataReader。如果代码使用阅读器而不处理它,它将不会显式返回到池中,对吗?
这是调用代码:
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中读取任何内容?
答案 0 :(得分:4)
如果代码使用阅读器而不处理它,它将不会显式返回到池中,对吗?
这是正确的。将代码更改为:
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
。