Я пытаюсь выяснить, как ускорить эту операцию. Перед тем, как импортировать запись из текстового файла, мне сначала нужно посмотреть, существует ли она в базе данных. Если он существует, я собираюсь выполнить операцию обновления на нем. Если он не существует, я собираюсь создать новую запись.
Выполнение кода, который вы видите под этой операцией, занимает где-то около 3 часов.
Я пытался использовать метод поиска ADO, и на самом деле он медленнее, чем метод фильтра.
База данных является базой данных Visual Foxpro 6. Таблица имеет индекс для поля item_cd, но для таблицы не установлен первичный ключ. Это вне моего контроля, так как я не писал программное обеспечение и стараюсь держаться подальше от внесения каких-либо структурных изменений в базу данных.
В текстовом файле 46652 строки и около 650 000 записей / строк в наборе записей ADO. Я думаю, что сокращение набора записей было бы самым большим шагом в исправлении этого, но я не придумал никакого способа сделать это. Я пытаюсь предотвратить создание повторяющихся записей, поскольку первичный ключ отсутствует, и поэтому мне действительно нужно иметь всю таблицу в моем наборе записей.
Поскольку я запускаю это на своей локальной машине, похоже, что операция ограничена мощностью процессора. В действительности это может быть использовано по всей сети, особенно если я смогу заставить его работать быстрее.
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