asp.net 关于DbCommand抽象类

来源:百度知道 编辑:UC知道 时间:2024/06/01 02:22:48
private DbCommand _command;
private DbConnection _connection;
private DbProviderFactory _factory;

...

this._connection = this._factory.CreateConnection();
this._command = this._connection.CreateCommand();
this._command.CommandText = sql;
object num = this._command.ExecuteNonQuery();

为什么这里的this._command.ExecuteNonQuery()可以运行..但是ExecuteNonQuery()方法是一个抽象方法,而且在调用ExecuteNonQuery()方法的类里并没有重写此方法啊,为什么可以运行呢?,这是怎么回事啊,,高手们指定一下啊..

DbCommand里ExecuteNonQuery();
public abstract int ExecuteNonQuery();是这样声明的..

呵呵,你可能真的迷了,抽象类是不能实例的,抽象方法也是不能直接调用的,确实是这样.
但是,我们都知道,子类的对象是可以赋给基类对象的,如果在子类中实现了基类的方法,那么把子类对象赋给基类之后,基类再调用该方法时,其实调用的是子类的已经实现的那个方法了.
说的有点绕口,不知你看明白了没有?
有了这些理论,再说你的问题,你的这个类是一个基类,它肯定有继承自它的子类,在它的子类中,肯定把这些都实现了.
然后,我们在用的时候,不是直接用的这个抽象类.我们往往是这样用的,声明的时候用抽象类,但是不实现它,实现它肯定会的是它的子类,也就是说把子类的一个对象赋给它,这样就可以用了.抽象类只是提供了一个接口而已.
明白了吗?推荐你看一下:设计模式中的第一个模式->简单工厂设计模式

我告诉你,this._command = this._connection.CreateCommand(); 写这句的时候,你已经把它实例话,它已经不抽象了,其实这句也一样this._connection = this._factory.CreateConnection(); 都被实例化了,所以可以用

为什么要重写才能使用此方法呢.本身ExecuteNonQuery()就是这样使用的呢。以下是MSDN.你太牛角了
msdn
ExecuteNonQuery 执行编录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句更改数据库中的数据。

虽然 ExecuteNonQuery 不返回任何行,但是映射到参数的任何输出参数或返回值都会用数据进行填充。

对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于其他所有类型的语句,返回值为 -1。