为什么无法初始化 Datareader?

6
我们在类名前使用抽象关键字来限制创建类的实例。但是,Datareader不是一个抽象类,但我们也无法创建它的实例。你能解释一下为什么吗?
我进行了搜索后发现,这是因为它没有构造函数,所以我们不能创建对象。但据我所知,如果没有构造函数,则编译器会自动创建一个默认构造函数。
请帮忙确认一下。

2
通常情况下,不需要自己创建读取器;你可以请求一个命令来代替你完成。你现在想要做什么? - Marc Gravell
2个回答

6

DbDataReader 是一个抽象类。如果你的意思是 SqlDataReader,它没有公共构造函数,所以你不能创建一个实例。它只有一个 internal 构造函数(ILSpy):

// System.Data.SqlClient.SqlDataReader
internal SqlDataReader(SqlCommand command, CommandBehavior behavior)
{
    // ...
}

来自 MSDN:

要创建 SqlDataReader,您必须调用 SqlCommand 对象的 ExecuteReader 方法,而不是直接使用构造函数。

通常最好避免实例化 DataReader,因为它只能通过 SqlCommand.ExecuteReader 创建。


1
我们可以这样做:即使SqlDataReader没有公共构造函数,但它有默认构造函数,因此我们可以使用“System.Data.Common.DbDataReader reader = new System.Data.SqlClient.SqlDataReader();”。 - Pranay Rana
2
@PranayRana:你尝试编译了吗?没有默认构造函数,只有一个静态构造函数和我已经提到过的内部构造函数。 - Tim Schmelter
这是编译时错误,感谢您帮助我理解这个问题... - Pranay Rana
非常感谢@TimSchmelter :-) - John
1
避免实例化 DataReader 是一个好主意的原因是什么? - Michael Haddad

0

只需创建自己的类,实现DbDataReader并覆盖方法即可。

public class InMemoryDbReader: DbDataReader
{
    ...
}

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