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