大家好,
我正在考虑这行代码
IDataReader myReader = questDatabase.ExecuteReader(getQuest);
我正在使用DAAB,但我无法理解方法ExecuteReader(DbCommand)返回IDataReader接口的意义和含义是什么。
任何人都可以解释,请
答案 0 :(得分:16)
它允许您使用DataReader而无需知道您正在使用哪种类型的DataReader(即SqlDataReader, OleDbDataReader, EtcDataReader
),因此如果有一天您想要更改正在使用它的datareader将不会影响您的逻辑,换句话说,它给你抽象。
例如:
你可以使用
IDbCommand command = GiveMeSomeCommand();
IDataReader r = command.ExecuteReader();
不知道您正在使用哪个提供商
可以是:
private static IDbCommand GiveMeSomeCommand()
{
return new OleDbCommand();
}
或者可以是
private static IDbCommand GiveMeSomeCommand()
{
return new SqlCommand();
}
或其他什么。
编辑:
您也可以使用DBFactories。
DbProviderFactory factory = GiveMeSomeFactory();
IDbCommand command = factory.CreateCommand();
IDataReader r = command.ExecuteReader();
//and create more objects
IDataAdapter adapter = factory.CreateDataAdapter();
IDbConnection conn = factory.CreateConnection();
然后在其他图层
中创建您的提供程序private DbProviderFactory GiveMeSomeFactory()
{
if(something)
return SqlClientFactory.Instance;
else if(somethingElse)
return OracleFactory.Instance;
else if(notThisAndNotThat)
return MySqlFactory.Instance;
else
return WhateverFactory.Instance;
}
答案 1 :(得分:6)
该方法将返回一个对象,该对象是一个类的实例,该类的类将支持IDataReader
。
关键是,对象的类型并不重要,只是该类实现了接口。
如果你开车,你不需要知道它是福特,还是丰田,你也可以用同样的方式驾驶汽车。
驾驶界面是相同的,一旦汽车支持界面,你就可以驾驶它。
与IDataReader
同上,一旦返回的类支持界面,就可以使用它。
答案 2 :(得分:4)
它返回一个接口,因为接口的实现并不重要,只是接口提供的API。
答案 3 :(得分:4)
“返回一个接口”实际上意味着:
返回实现该接口的某个类的实例
在这种情况下,它返回一个非常类似于SqlDataReader
对象的对象,它允许您执行Read()
之类的方法并实现IDisposable
和IDataRecord
接口。
答案 4 :(得分:3)
它不是返回一个接口本身,而是一个支持该接口的对象。
答案 5 :(得分:3)
它返回一个实现这个特定接口的对象,这就是你真正关心的。该对象是IDataReader
,可以执行IDataReader
具有的所有方法。