一旦数据读取器读取所有结果,如何触发回调

时间:2015-03-15 12:54:35

标签: c# .net

我有一个像

这样的课程
class ReadData{
 public IdataReader Execute(string sql){
    // Ado.net code here
    return cmd.ExecuteReader();
 }
}

这是示例实现,它工作正常。 我在呼叫者中这样打电话

class caller{

  void CallMethod(){
    var reader = Execute("Sql query here");
    while(reader.Read()){
       logic here
    }
    //Here i need to get the out params after reading the resultset.
    //But the impplementation should in the class ReadData.
    //because that class has implementation to get the out params for the 
    //other type means, execute without resultset get only output params
 }
}

一些可能的方法,比如使用回调调用第一个方法,并且一旦完全读取数据,然后读取out参数。

我不知道如何实现这些东西。

有什么更好的方法吗? 请帮帮我...

1 个答案:

答案 0 :(得分:2)

public void Execute(string sql, Action<IDataRecord> action)
{
    using(var connection = new ...)
    {
        connection.Open();

        using(var command = new ...)
        {
            using(var reader = command.ExecuteReader())
            {
               while(reader.Read())
               {
                   action(reader);
               }
            }
        }
    }
}

这可以让你做这样的事情:

var entries = List<object>();

Execute("Sql query here", row => entries.Add(row["Field"]));

或者你可以尝试一个更有趣的appraoch:

public IEnumerable<IDataRecord> Execute(string sql)
{
    using(var connection = new ...)
    {
        connection.Open();

        using(var command = new ...)
        {
            using(var reader = command.ExecuteReader())
            {
               while(reader.Read())
               {
                   yield return reader;
               }
            }
        }
    }
}

这将允许这样的事情:

var list = Execute("Sql query here").Where(row => (int)row["Field"] == 17)).ToList();

但是,如果你没有正确地实现它,这会产生一些奇怪的效果。