如果我不处理我的IDataReader,我的连接是否会返回到池中?

时间:2014-01-13 18:28:06

标签: c# .net sql-server ado.net connection-pooling

我正在尝试确定代码库中是否存在明显的错误。

有问题的代码调用第三方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中读取任何内容?

1 个答案:

答案 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