1

我创建了一个 Sql 帮助类来处理我的大部分需求。

其中,我有一个执行 SQL 语句并返回 SqlDataReader 的函数,如下所示:

public static SqlDataReader ExecuteCommand(string cmdText, bool useParameters)
{
    using (var sqlConnection = new SqlConnection(_connectionString.ConnectionString))
    {
        sqlConnection.Open();
        using (var sqlCommand = new SqlCommand(cmdText, sqlConnection))
        {
            if (useParameters && SqlParameterCollection.Count > 0)
            {
                sqlCommand.Parameters.AddRange(SqlParameterCollection.ToArray());
            }

            using (var sqlDataReader = sqlCommand.ExecuteReader())
            {
                return sqlDataReader;
            }
        }
    }
}

显然,这个问题是它返回一个需要打开连接的 sqlDataReader 以及连接已关闭的事实。

我已经研究过返回一个 SqlDataAdapter,但是在阅读了以下线程SqlDataAdapter vs SqlDataReader之后,当您完全不知道数据量时,作为在每个场景中使用的通用函数听起来并不是一个好主意它应该加载。

那么......有什么好的选择?

我唯一能想到的就是循环遍历 SqlDataReader 中的行并执行yield return IEnumerable<IDataRecord>.

有没有更好的方法来实现这一点,或者这差不多吗?

4

1 回答 1

3

您可以使用CommandBehavior.CloseConnection, 将闭包卸载给调用者 -但这会使您的代码正确地依赖于调用者using和阅读器。

就个人而言,我会尽量减少这种类型的依赖 - 并将实现代码尽可能靠近 DB 代码。实际上,调用者需要原始阅读器的情况并不多——或者至少不应该有。我强烈建议使用“dapper”或 ORM 之类的工具,这样您就可以执行以下操作:

return connection.Query<T>(cmdText, args).ToList();

这样就不会给调用者留下很多地方弄乱事情了。

于 2013-11-04T16:47:22.893 回答