使用_RecordsetPtr接口开发ACCESS数据库就介绍到这里,它可以更加灵活地操作数据库。当然,您还可以使用_CommandPtr接口开发ACCESS数据库,它提供了一个简单的方法来执行返回记录集的SQL语句。本文不讲解_CommandPtr接口。
用心的读者您可能已经发现,使用Connection对象的Execute方法可以完成数据库的操作,使用Recordset也可以完成同样功能的数据库操作。我们应该采用哪种方法呢?另外,Connection对象的Execute方法返回一个记录集,Recordset的Open方法也打开一个记录集,二者有什么区别呢?下面我们将进行说明。
前面已经讲过,数据库和ADO的记录集是两个不同的概念, 是存在于不同物理位置的两个存储空间. 记录集相当于是实际数据的一份拷贝. 正因为记录集是相对脱离数据库而存在的, 所以才光标类型和锁定类型这两个问题。
在记录集被创建以后,数据提供者负责在数据库和记录集之间进行侦测,记录集的类型決定了提供者在多大程度上确保数据库与记录集之间的一致性,这通常是由光标类型決定的, 而同时也決定了提供者采取什么方式来确保用戶在更新数据库时, 本次更新的完整性, 这是由锁类型決定的。
比方说, 一个用户正在对一个记录集做一次更新,并试图将此更新应用到数据库中。因为通过记录集来更新数据是分两步完成的, 第一步是修改记录集的內容, 第二步才是将修改通过数据提供者更新到数据库中, 两步之间存在时间上的细微差別. 所以, 他可能会遇到一个问题, 即他的第一步到第二步的操作, 是否会因为这期间同时遇到其他用户的操作而失败。
对数据库的部分记录进行锁定解決了这个问题, 而不同类型的锁, 解決问题的方式也不一样。 有的在第一步开始时就锁定数据库, 有的在第二步开始时才锁定数据库。锁定占用了数据库资源, 而使得记录集在对于使用者的更新操作方面更加可靠。
综上所述, 可以得出一个结论: 锁是由于记录集的存在而存在的, 沒有记录集, 或者說沒有可供更新的记录集,锁就沒有存在的意义。
从效率上考虑,锁会降低并发性, 尤其是当同时连接数据库的用户增多时. 不采用记录集来更新数据库总是更好的选择,虽然使用起来会更麻烦一些。
选择与数据库联系得较少的记录集总是能提高效率, 因为提供者无需做很多的侦测工作. 比如, 动态的记录集总是实时地将数据库的状态反映到记录集中, 这很有用, 但也会耗费无提供者更多的精力. 如果无需更新数据, 只读的记录集是与数据库联系得最少的一种, 选择使用这种记录集来代替其它类型在效率上通常会有很明显的提高。
Connection对象的Execute方法只能得到一个只能前移的、只读的记录集。
使用RecordAffected参数找出有多少条记录受到影响。一旦Execute命令执行完毕,受SQL命令影响的记录数就返回到RecordAffected参数中。
Connection的Execute方法不支持任何锁定类型,这就是和Recordset的Open方法的主要区别所在,所以用Recordset的Open方法将更灵活,而Connection的Execute方法更简洁高效。
Execute是Connection对象对数据库操作的一个方法,你可以把它理解为执行SQL语句,也就是说Execute是一个操作方法,而不是像open方法返回一个记录集,然后再对记录集操作。
尽量使用SQL语句进行数据库操作。尽管采用Recordset对象来更新数据是非常方便的,但是它的开销也更大,所以如果可能的话,就要采用SQL语句来更新数据。
Execute返回的记录集是只读的, 不可以更新, 所以也就不存在锁。这个记录集不具备Recordset可以改变光标类型和锁定类型的功能,它只能返回一个只能前移的、只读的记录集。
尽管很多开发人员都习惯采用“SELECT * FROM 表名”的模式进行查询,但是为了提高系统的效率,如果你只需要其中某几个字段值的话,最好把这几个字段直接写出来,同时需要限定返回记录集的范围(通过WHERE子句进行限定)。
就讲这些吧,有点繁琐,欠进一步整理,希望对您有所帮助。
ADO数据库开发的例子:
(1) http://blog.csdn.net/sding/archive/2009/08/18/4457853.aspx
(2) http://www.wangchao.net.cn/bbsdetail_48289.html