2010-05-18 43 views
1

我有一个从SQL Server获取一些数据的标准方法。我想重构这个,以便根据枚举的值(作为方法参数传递)执行不同的sql语句(全部返回datareader)。执行sql语句并获取datareader - WITH流量控制

我似乎无法用优雅和整洁的方式编码。什么是这样做的好方法?

谢谢

回答

1

也许这样的事情?

// 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); 
     } 
    } 
} 
+0

感谢。然后委托执行一个方法,然后操作我假设的sql语句。看起来不错。 – dotnetdev 2010-05-18 23:28:42

+0

是的,它会将参数添加到命令中。你可以有另外一种方法来做另一个开关,并根据枚举类型添加适当的参数。 – dcp 2010-05-18 23:32:20

2

我有好几个这类事情在我的项目中,一个简单的例子:

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(); 
      //... 
     } 
    } 
}