编程语言
首页 > 编程语言> > c#-如果不处理IDataReader,我的连接是否返回到池中?

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