【发布时间】:2013-04-24 05:18:53
【问题描述】:
我正试图弄清楚如何加快此操作。在从文本文件导入记录之前,我首先需要查看数据库中是否存在一条记录。如果它确实存在,我将对它执行更新操作。如果它不存在,我将创建一个新记录。
运行您在下面看到的代码,此操作大约需要 3 小时。
我尝试过使用 ADO 的 find 方法,它实际上似乎比 filter 方法慢。
该数据库是 Visual Foxpro 6 数据库。该表确实在 item_cd 字段上有一个索引,但该表没有建立任何主键。这是我无法控制的,因为我没有编写软件,并且我试图避免对数据库进行任何结构更改。
文本文件中有 46652 行,ADO 记录集中大约有 650,000 条记录/行。我认为精简记录集将是解决此问题的最大步骤,但我还没有想出任何方法来做到这一点。我试图防止创建重复记录,因为没有主键,所以我真的需要在我的记录集中拥有整个表。
因为我在本地机器上运行它,所以该操作似乎受到 CPU 能力的限制。实际上,这可能会在整个网络中使用,尤其是如果我能让它运行得更快的话。
Dim sFileToImport As String
sFileToImport = Me.lstFiles.Text
If sFileToImport = "" Then
MsgBox "You must select a file from the listbox to import."
Exit Sub
End If
If fConnectToDatabase = False Then Exit Sub
With gXRst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockReadOnly
.Open "SELECT item_cd FROM xmsalinv ORDER BY item_cd ASC", gXCon
End With
Call fStartProgress("Running speed test.")
Dim rstTxtFile As ADODB.Recordset
Set rstTxtFile = New ADODB.Recordset
Dim con As ADODB.Connection
Set con = New ADODB.Connection
Dim sConString As String, sSQL As String
Dim lRecCount As Long, l As Long
Dim s As String
sConString = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & gsImportFolderPath & ";Extensions=asc,csv,tab,txt;Persist Security Info=False;"
con.Open sConString
sSQL = "SELECT * FROM [" & sFileToImport & "]"
rstTxtFile.Open sSQL, con, adOpenKeyset, adLockPessimistic
If Not (rstTxtFile.EOF And rstTxtFile.BOF) = True Then
rstTxtFile.MoveFirst
lRecCount = rstTxtFile.RecordCount
Do Until rstTxtFile.EOF = True
'This code appears to actually be slower than the filter method I'm now using
'gXRst.MoveFirst
'gXRst.Find "item_cd = '" & fPQ(Trim(rstTxtFile(0))) & "'"
gXRst.Filter = "item_cd = '" & fPQ(Trim(rstTxtFile(0))) & "'"
If Not (gXRst.EOF And gXRst.BOF) = True Then
s = "Item Found - " & Trim(rstTxtFile(0)) 'item found
Else
s = "Item Not Found - " & Trim(rstTxtFile(0)) 'Item not found found
End If
l = l + 1
Call subProgress(l, lRecCount, s)
rstTxtFile.MoveNext
Loop
End If
Call fEndProgress("Finished running speed test.")
Cleanup:
rstTxtFile.Close
Set rstTxtFile = Nothing
gXRst.Close
【问题讨论】:
-
顺便说一句,fpq 是一个自定义函数,用两个单引号替换单引号。
-
更新:纯粹作为一个实验,我尝试将 item_cd 字段设置为主键。看来它可能会进一步减慢此操作。
标签: vb6 ado text-files visual-foxpro