ACC2000: DAO Property Retrieval Slow with Linked Table ObjectsID: Q200575
|
When you use Data Access Objects (DAO) to retrieve properties for linked TableDef objects, the process is much slower than when you use DAO to retrieve the properties for local TableDef objects.
The Microsoft Jet database engine must create a temporary query for each property retrieval of a linked TableDef object. The Jet database engine does not need to do this when retrieving properties for local TableDef objects.
Microsoft provides programming examples for illustration only, without warranty
either expressed or implied, including, but not limited to, the implied warranties of
merchantability and/or fitness for a particular purpose. This article assumes that you
are familiar with the programming language being demonstrated and the tools used to
create and debug procedures. Microsoft support professionals can help explain the functionality
of a particular procedure, but they will not modify these examples to provide added
functionality or construct procedures to meet your specific needs. If you have limited
programming experience, you may want to contact a Microsoft Certified Solution Provider
or the Microsoft fee-based consulting line at (800) 936-5200. For more information about
Microsoft Certified Solution Providers, please see the following page on the World Wide Web:
http://www.microsoft.com/mcsp/For more information about the support options available from Microsoft, please see the following page on the World Wide Web:
http://www.microsoft.com/support/supportnet/overview/overview.aspInstead of retrieving the properties for the linked TableDef objects in the current database, you can use DAO to open the database that the TableDef objects actually reside in, and then retrieve the properties. To accomplish this, follow steps 1 through 17 in the "Steps to Reproduce Behavior" section later in this article, and substitute the following procedure for the procedure documented in step 15:
Sub EnumProperties(tDefName As String)
Dim db As Database
Dim tDef As TableDef
Dim tDefSourceTableName As String
Dim tDefProperty As Property
Dim PropCount As Integer
Dim dbPath As String
Dim tDefField As Field
Dim StartTime As Date, EndTime As Date
StartTime = Now
Set db = CurrentDb
Set tDef = db.TableDefs(tDefName)
If (tDef.Attributes And dbAttachedTable) <> 0 Then
If InStr(tDef.Connect, ".mdb") > 0 Then
tDefSourceTableName = tDef.SourceTableName
dbPath = Right$(tDef.Connect, _
Len(tDef.Connect) - _
InStr(tDef.Connect, "="))
Set db = DBEngine(0).OpenDatabase(dbPath)
Set tDef = db.TableDefs(tDefSourceTableName)
End If
End If
For Each tDefProperty In tDef.Properties
Next
For Each tDefField In tDef.Fields
For Each tDefProperty In tDefField.Properties
PropCount = PropCount + 1
Next
Next
EndTime = Now
Debug.Print
Debug.Print "Table: " & tDef.Name
Debug.Print "Number of Table and Field Properties: " & _
tDef.Properties.Count + PropCount
Debug.Print "Total Time: " & _
DateDiff("s", StartTime, EndTime) & " second(s)"
db.Close
End Sub
Microsoft has confirmed this to be a problem in the Microsoft products listed at the beginning of this article.
Option Explicit
Sub CreateProperties()
Dim db As Database
Dim tDef As TableDef
Dim prop As Property
Dim i As Integer
Set db = CurrentDb
Set tDef = db.TableDefs!Employees
For i = 1 To 700
Set prop = tDef.CreateProperty("Prop" & i, dbText, i)
tDef.Properties.Append prop
Next
tDef.Properties.Refresh
MsgBox "Number of Properties: " & tDef.Properties.Count
db.Close
End Sub
CreateProperties
Note that the message box indicates the number of properties that were
added to the Employees table. This number will include any existing
properties as well.
Option Explicit
Sub EnumProperties(tDefName As String)
Dim db As Database
Dim tDef As TableDef
Dim tDefProperty As Property
Dim PropCount As Integer
Dim tDefField As Field
Dim StartTime As Date, EndTime As Date
StartTime = Now
Set db = CurrentDb
Set tDef = db.TableDefs(tDefName)
For Each tDefProperty In tDef.Properties
Next
For Each tDefField In tDef.Fields
For Each tDefProperty In tDefField.Properties
PropCount = PropCount + 1
Next
Next
EndTime = Now
Debug.Print
Debug.Print "Table: " & tDef.Name
Debug.Print "Number of Table and Field Properties: " & _
tDef.Properties.Count + PropCount
Debug.Print "Total Time: " & _
DateDiff("s", StartTime, EndTime) & " second(s)"
db.Close
End Sub
EnumProperties "Employees"
Note the number of seconds it takes to enumerate through all
properties of the Employees table.
EnumProperties "Employees1"
Note that the number of seconds it takes to enumerate the properties
of the linked table is much higher.Additional query words:
Keywords : kbprg kbdta MdlDao TblOthr
Version : WINDOWS:2000
Platform : WINDOWS
Issue type : kbprb
Last Reviewed: July 6, 1999