如何将SqlDataReader转换/强制转换为IDataReader。

6
什么是将SqlDataReader转换为IDataReader的最简单方法?
或者,将List<>对象转换为IDataReader是否更容易/可能?

3
SqlDataReader 已经实现了 IDataReader 接口。您能否贴一些代码来展示您所遇到的实际问题? - Graham Clark
4个回答

9
什么是将SqlDataReader转换为IDatareader的最简单方法?
由于SqlDataReader实现了IDataReader,因此这只是一个隐式转换:
SqlDataReader typedReader = ...
IDataReader untypedReader = typedReader;

3

SqlDataReaderIDataReader 的实现,因此您无需进行任何转换。在您的代码需要 IDataReader 的任何地方,都可以使用 Sql 实现。

// Given a method with this signature
public void ProcessData(IDataReader reader);

// You can do this
SqlDataReader sqlReader = command.ExecuteReader();
ProcessData(sqlReader);

关于 List<T>IDataReader:除了可枚举之外,它们的功能非常不同。最显著的区别是,数据读取器提供对列数据的访问(主要是因为它实现了 IDataRecord 接口),这对大多数列表来说没有意义。
你可以实现一个适配器,通过数据读取器接口提供对 List<T> 的访问,但这将不是很适合,需要相当多的工作。

3

如何最简单地将SqlDataReader转换为IDataReader

不行。SqlDataReader类不是IDataReader接口。

要进行强制类型转换(赋值给变量),使用

IDataReader untypedReader = typedReader; 

但是,这不是一次转换。它是一次转型。按照定义,无法将接口转换为整数,因为接口无法实例化。

1

或者你可以直接进行类型转换,但正如已经提到的那样,这在大多数情况下是不必要的,除非你正在创建或使用一个通用接口,因为所有 IDbDataReader 的属性和方法都可以在 SqlDataReader 中使用。

((IDbDataReader)typedReader).SomeMethod();

2
这并不是真正的“装箱”(boxing)(如果SomeMethod返回实现了IDbReader接口的结构体,则可能是,但这似乎不太可能)。 - Marc Gravell
@Marc,抱歉打错了。我需要更多的括号。 - Brad
1
括号更好,但这仍然不是装箱... 装箱是指将值类型强制转换为引用类型容器(object或未通过泛型约束的接口)。 - Marc Gravell
1
@Marc,啊...没错。我已经更新为cast而不是box了。谢谢!这样更合适吗? - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接