我有一个像
这样的课程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参数。
我不知道如何实现这些东西。
有什么更好的方法吗? 请帮帮我...
答案 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();
但是,如果你没有正确地实现它,这会产生一些奇怪的效果。