代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

执行sql语句并使用流控制获取datareader

c#
  •  1
  • GurdeepS  · 技术社区  · 14 年前

    我有一个从sql server获取数据的标准方法。我想重构它,以便基于枚举的值(作为方法参数传递),执行不同的sql语句(所有返回datareader)。

    我似乎不能用优雅整洁的方式来编码。做这件事的好方法是什么?

    谢谢

    2 回复  |  直到 14 年前
        1
  •  2
  •   JYelton Melchior Blausand    14 年前

    我的项目中有很多这样的东西,举个简单的例子:

    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();
                //...
            }
        }
    }
    
        2
  •  1
  •   dcp    14 年前

    也许是这样的?

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