Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 如何在数据读取器读取所有结果后触发回调_C#_.net - Fatal编程技术网

C# 如何在数据读取器读取所有结果后触发回调

C# 如何在数据读取器读取所有结果后触发回调,c#,.net,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.Re

我有一门课

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
 }
}
一些可能的方法,比如用callback调用第一个方法,一旦数据被完全读取,然后读出参数

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

有没有更好的办法? 请帮我做这件事

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

然而,如果你没有正确地具体化,这会对延迟执行产生一些奇怪的影响。

u是说第二种方法有问题,或者两种方法都有问题?第二种方法是为那些知道自己在做什么的人提供的。有了第一个,犯错误就难多了。如果使用得当,两者都可以正常工作。
var entries = List<object>();

Execute("Sql query here", row => entries.Add(row["Field"]));
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();