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