5)缺省的记录集类型
DAO 能够根据记录集的数据源类型,以及打开记录集的方式,自动地设置缺省的记录集类型。因此,一般不需要指定记录集类型。然而,可以在 OpenRecordset 方法中指定 type 参数,以取消缺省的类型。
按照打开记录集的方式,下表中列出了可用的类型和缺省的类型。
■ 使用 Database 对象的 OpenRecordset 方法:
Set rstNew = dbs.OpenRecordset("Data Source")
如果 Data Source 为数据库中的本地表,那么可以用表类型、动态集、快照和动态类型的 Recordset 对象,缺省的记录集类型为表类型。如果 Data Source 为其它类型,那么只能使用动态集和快照类型的 Recordset 对象,动态集类型为缺省的类型。
■ 使用 TableDef 对象的 OpenRecordset 方法。
Set rstNew = tdfTableData.OpenRecordset
如果 tdfTableData 指的是 Microsoft Jet 数据库 (.mdb) 中的表,或者直接打开的 ISAM 数据库,那么所有的五种类型都是可用的,表类型的记录集为缺省的类型。如果 tdfTableData 在 ODBC 数据库中,或者是外部数据库中的链接表,那么只能用动态集和快照类型的 Recordset 对象,动态集类型为缺省类型。
■ 使用 QueryDef 对象的 OpenRecordset 方法:
Set rstNew = qdfQueryData.OpenRecordset
只能使用动态集和快照类型的 Recordset 对象,动态集类型为缺省的类型。
■ 使用现有的 Recordset 对象的 OpenRecordset 方法:
Set rstNew = rstExisting.OpenRecordset
只能使用动态集和快照类型的 Recordset 对象。缺省的类型为现有的记录集的类型,在上例中,即 rstExisting 的类型。
6)具体创建Recordset对象的例子
在下面的例子中可能用到一些还未讲到的东西,但由于使用的比较简单,相信大家还是能够理解。
①以表为基础创建记录集
用基本表创建 Recordset 对象的方法,取决于该表对于当前数据库是本地表,还是位于另一个数据库中的链接表。
用本地 Microsoft Jet 数据库中的表创建记录集
下列程序代码使用 OpenRecordset 方法为一个表创建了表类型的 Recordset 对象:
Dim dbs As Database, rstCustomers As Recordset
Set dbs = OpenDatabase("Northwind.mdb")
Set rstCustomers = dbs.OpenRecordset("Customers")
请注意,创建表类型的记录集时无需使用 dbOpenTable 常数。如果省略了 type 常数,DAO 将根据数据源和用来创建记录集的对象的类型,选择最适当的 Recordset 对象类型。当从本地表打开记录集时,可以使用表类型的记录集,DAO 将使用它。
②用其它数据库格式的链接表创建记录集
下列程序段为链接的 Paradox 3.x 表创建了一个动态集类型的 Recordset 对象。当从非 Microsoft Jet 数据库中的链接表打开记录集时,表类型是不能使用的,因此,DAO 的使用效率仅次于它的动态集类型。
Dim dbs As Database
Dim tdfNonJetLinked As TableDef
Dim rstTableData As Recordset
' 打开数据库并创建 TableDef。
Set dbs = OpenDatabase("Northwind.mdb")
Set tdfNonJetLinked = dbs.CreateTableDef("PDXAuthor")
' 连接到名为 Author 的 Paradox 表,该表位于数据库
' C:\PDX\Publish。
tdfNonJetLinked.Connect = _
"Paradox 3.X;DATABASE=C:\PDX\Publish"
tdfNonJetLinked.SourceTableName = "Author"
' 链接该表。
dbs.TableDefs.Append tdfNonJetLinked
' 为该表创建动态集类型的记录集。
Set rstTableData = tdfNonJetLinked.OpenRecordset()
如果先打开 Paradox 数据库,则可直接打开 Paradox 表。
③以查询为基础创建记录集
也可以基于存储的选择查询来创建 Recordset 对象。在下例中,“Current Product List”是保存在当前数据库中的一个选择查询。
Dim dbs As Database, rstProducts As Recordset
Set dbs = OpenDatabase("Northwind.mdb")
Set rstProducts = dbs.OpenRecordset _
("Current Product List")
如果当前并不存在存储的选择查询,OpenRecordset 方法允许使用 SQL 字符串代替查询名。上例可以改写为以下程序段:
Dim dbs As Database, rstProducts As Recordset
Dim strQuerySQL As String
Set dbs = OpenDatabase("Northwind.mdb")
strQuerySQL = "SELECT * FROM Products " _
& "WHERE Discontinued = No " _
& "ORDER BY ProductName;"
Set rstProducts = dbs.OpenRecordset(strQuerySQL)
这种方法的缺点在于,每次运行时都需要先编译查询字符串,而存储的查询只是在首次保存时编译一次,所以性能较佳。
注意 如果在 Microsoft Jet 中用 SQL 字符串或者存储的查询创建 Recordset 对象,那么,在查询返回了记录集的第一行以后,程序才会继续运行。在查询运行的时候,最好在状态栏中显示出适当的消息。如果使用 ODBCDirect,可以指定 dbRunAsync,它使查询在后台执行,应用程序能够继续执行其它语句。