Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用流控制执行sql语句并获取datareader_C# - Fatal编程技术网

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

C# 使用流控制执行sql语句并获取datareader,c#,C#,我有一个从SQLServer获取数据的标准方法。我想重构它,以便根据枚举的值(作为方法参数传递),执行不同的sql语句(全部返回datareader) 我似乎无法用优雅整洁的方式编写代码。这样做的好方法是什么 谢谢也许是这样的吧 // delegate to use for adding parameters delegate void AddParametersDelegate(IDbCommand cmd); IDataReader GetReader(SomeEnumType val,

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

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


谢谢

也许是这样的吧

// 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语句。看起来不错。是的,它会将参数添加到命令中。您也可以使用另一种方法,该方法执行另一个切换,并根据枚举类型添加适当的参数。