从SQL数据读取器读取数据的常用方法

时间:2018-10-08 10:10:01

标签: c# asp.net ado.net

我想创建一个应该返回数据读取器的方法,因为我不想一次又一次地打开和关闭连接。任何人都可以帮助我创建一种方法,我只需要传递命令文本和参数即可。

2 个答案:

答案 0 :(得分:2)

好吧,您可以这样做,甚至可能想要这样做,但是您确实不应该这样做。

数据读取器只能在连接模式下工作,这意味着要与数据读取器一起使用,需要保持与数据库的开放连接-因此,如果您的方法返回了数据读取器,则必须使连接保持打开状态,这就是使用数据读取器完成后,调用方法有责任关闭并处理它。

您应该做的是使用诸如Entity Framework或Dapper(我个人最喜欢)之类的ORM将来自数据库的结果直接获取到类中,以便在执行SQL语句后就可以立即关闭与数据库的连接。

如果您不能使用ORM,或者不想使用ORM,可以采用以下一种减少代码重复的方法:
使用接收sql来执行的通用方法Func<IDbDataReader, T>和sql命令所需的参数,并返回T的实例:

public T Execute<T>(
    // sql statement to execute
    string sql, 
    // E.g CommandType.StoredProcedure
    CommandType commandType, 
    // this holds the logic to create an instance of T from the data reader
    Func<IDbDataReader, T> populator, 
    // parameters required to the sql
    params IDbDataParameter[] parameters)
{
    using(var con = new SqlConnection(_connectionString))
    {
        using(var cmd = new SqlCommand(sql, con))
        {
            cmd.CommandType = commandType;
            cmd.Parameters.AddRange(parameters);
            con.Open();
            using(var reader = cmd.ExecuteReader())
            {
                return populator(reader); 
            }
        }
    }
} 

现在,填充器将在using语句中执行,因此需要处置的所有内容都会在应有的时间准确地处置。

答案 1 :(得分:0)

我创建了这个通用方法,使用SQL数据读取器从数据库读取数据,它对我来说很好用。

     public static SqlDataReader ExecuteCommonReader(string Query, CommandType type, params IDataParameter[] sqlParams )
    {
        try
        {
            SqlCommand _cmd = new SqlCommand();
            string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            var _con = new SqlConnection(connString);

            _con.Open();
            _cmd.Connection = _con;
            _cmd.CommandType = type;
            _cmd.CommandText = Query;
            if (sqlParams != null)
            {
                foreach (IDataParameter para in sqlParams)
                {
                    _cmd.Parameters.AddWithValue(para.ParameterName, para.Value);
                }
            }
            return _cmd.ExecuteReader(CommandBehavior.CloseConnection);

        }
        catch (Exception ex)
        {

            return null;
        }

    }