我写了一个继承DbConnection的类,我不完全理解为什么它会像它一样工作。
起初我有这个:
root@localhost:playground > set session foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)
root@localhost:playground > insert into comments (id) values (null); Query OK, 1 row affected (0.00 sec)
root@localhost:playground > set session foreign_key_checks=1;
Query OK, 0 rows affected (0.00 sec)
root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
| 1 | 0 |
+----+-----------+
1 row in set (0.00 sec)
root@localhost:playground > update comments set id = 0 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
| 0 | 0 |
+----+-----------+
1 row in set (0.00 sec)
没有调用Close()方法,我们可以看到连接停留在MySQL服务器上。
现在我有了这个,它可以工作(它确实关闭了连接,服务器就可以了):
root@localhost:playground > alter table comments auto_increment=0;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
为什么继承DbConnection类并重写Close()方法不起作用?
答案 0 :(得分:1)
您可以在reference source中看到DbConnection
未覆盖Dispose
,因此Dispose
不会致电Close
。
DbConnection
继承自Component
,这是IDisposable
的实施所在。您可以在reference source中看到其Dispose(bool disposing)
方法为virtual
,因此您应该覆盖它:
protected override void Dispose(bool disposing)
{
base.Dispose(disposing)
Close();
}
答案 1 :(得分:0)
using statement在块的末尾调用Dispose方法。
由于DbConnection也实现了IDisposable接口,因此第一个代码段中的using块会调用继承的Dispose方法。
连接保持活动可能是因为你覆盖了关闭功能,但是我不确定,如果我错了,请纠正我。