1
我有一个从SQL Server获取一些数据的标准方法。我想重构这个,以便根据枚举的值(作为方法参数传递)执行不同的sql语句(全部返回datareader)。执行sql语句并获取datareader - WITH流量控制
我似乎无法用优雅和整洁的方式编码。什么是这样做的好方法?
谢谢
我有一个从SQL Server获取一些数据的标准方法。我想重构这个,以便根据枚举的值(作为方法参数传递)执行不同的sql语句(全部返回datareader)。执行sql语句并获取datareader - WITH流量控制
我似乎无法用优雅和整洁的方式编码。什么是这样做的好方法?
谢谢
也许这样的事情?
// delegate to use for adding parameters
delegate void AddParametersDelegate(IDbCommand cmd);
IDataReader GetReader(SomeEnumType val, AddParametersDelegate addParms)
{
string sql = null;
switch (val)
{
case EnumVal1:
sql = "SQL Statement 1";
break;
case EnumVal2:
sql = "SQL Statement 2";
break;
.
default:
sql = "Default SQL Statement";
break;
}
using (IDbConnection conn = CreateDBConnection(connString))
{
using (IDbCommand cmd = conn.CreateCommand(sql))
{
// call the delegate to add the parameters to the SQL command
addParams(cmd);
return cmd.ExecuteReader(sql);
}
}
}
我有好几个这类事情在我的项目中,一个简单的例子:
enum QueryType {AQuery, BQuery};
private SqlDataReader DoQuery(QueryType _type)
{
using (SqlConnection conn = new SqlConnection("your connection string"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
switch(_type)
{
case QueryType.AQuery:
cmd.CommandText = @"SELECT thing FROM table";
break;
case QueryType.BQuery:
cmd.CommandText = @"SELECT other_thing FROM table";
break;
}
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
//...
}
}
}
感谢。然后委托执行一个方法,然后操作我假设的sql语句。看起来不错。 – dotnetdev 2010-05-18 23:28:42
是的,它会将参数添加到命令中。你可以有另外一种方法来做另一个开关,并根据枚举类型添加适当的参数。 – dcp 2010-05-18 23:32:20