Обновление набора записей VB6
Я запускаю программу vb6, которая просматривает множество записей в таблице базы данных и вводит дату в поле. Это займет много часов, чтобы бежать.
Я заметил, что количество записей в таблице увеличивается на 1 каждые несколько секунд, а затем уменьшается на 1 (возвращаясь к исходному количеству). Для этого есть причина?
Я использую набор записей VB6 и функцию обновления, т.е. rs.update. Я не вставляю никаких новых записей.
Код выглядит следующим образом:
rs.Open "select reference,value1,datefield from datetable where field1 = 'value1' " & _
"order by reference", objAuditCon.ActiveCon, adOpenStatic, adLockPessimistic
Do While Not rs.EOF
intReadCount = intReadCount + 1
DoEvents
If Not IsNull(rs("value1")) Then
testArray = Split(rs("value1"), ",")
rs2.Open "SELECT Date FROM TBL_TestTable WHERE Record_URN = '" & testArray(1) & "'", objSystemCon.ActiveCon, adOpenStatic, adLockReadOnly
If rs2.EOF Then
End If
If Not rs2.EOF Then
rs("DateField") = Format$(rs2("Date"), "dd mmm yy h:mm:ss")
rs.Update
intWriteCount = intWriteCount + 1
End If
rs2.Close
Else
End If
rs.MoveNext
Loop
rs.Close
2 ответа
Простой ответ: выньте оператор DoEvents. Если вы используете его для обновления экрана, периодически выполняйте ручное обновление вашего графического интерфейса после, скажем, 1000 итераций цикла.
Причина, по которой это может вызывать проблему, заключается в том, что другой код, который вы не можете контролировать, может выполняться при вызове DoEvents.
Ну, вы можете значительно сократить вашу работу с SQL здесь.
If Not IsNull(rs("value1")) Then
testArray = Split(rs("value1"), ",")
rs2.Open "SELECT Date FROM TBL_TestTable WHERE Record_URN = '" & testArray(1) & "'", objSystemCon.ActiveCon, adOpenStatic, adLockReadOnly
If rs2.EOF Then
End If
If Not rs2.EOF Then
rs("DateField") = Format$(rs2("Date"), "dd mmm yy h:mm:ss")
rs.Update
intWriteCount = intWriteCount + 1
End If
rs2.Close
По сути, мне кажется (я не использовал VB6 и ADO в течение 10 лет), загружая исходный набор записей вашей записи, проверяя значение, и, если это значение не равно нулю, запустив секунду, выберите ТО, обновляя набор записей.... Вы можете вместо того, чтобы делать все это, просто создать объект команды. Объявите их перед вашими циклами.dim objComm
set objComm = Server.CreateObject("ADODB.Command")
objComm.ActiveConnection = objSystemCon.ActiveCon 'I think this is your connn.
objComm.CommandType = 1 'adCmdText
Используйте это в своем цикле
objComm.CommandText = "UPDATE DateTable SET DateField = (SELECT Date FROM TBL_TestTable WHERE Record_URN = '" & testArray(1) & "'")
objComm.Execute
Вместо того чтобы делать второй осторожный выбор, извлекая данные, затем обновляя и выталкивая их обратно, просто выдвигайте оператор обновления. Это должно ускорить обработку ваших записей..... Я знаю, что когда-то давно писал такие вещи на VB6:)
Так что ваш код теперь должен читаться как
dim objComm
set objComm = Server.CreateObject("ADODB.Command")`
objComm.ActiveConnection = objSystemCon.ActiveCon 'I think this is your connn.
objComm.CommandType = 1 'adCmdText
rs.Open "select reference,value1,datefield from datetable where field1 = 'value1' " & _
"order by reference", objAuditCon.ActiveCon, adOpenStatic, adLockPessimistic
Do While Not rs.EOF
intReadCount = intReadCount + 1
DoEvents
If Not IsNull(rs("value1")) Then
testArray = Split(rs("value1"), ",")
objComm.CommandText = "UPDATE DateTable SET DateField = (SELECT Date FROM TBL_TestTable WHERE Record_URN = '" & testArray(1) & "'")
objComm.Execute
End If
rs.MoveNext
Loop
rs.Close
как вы видите, ваш оператор выбора все еще там, это вспомогательный выбор, преимущество огромно, вы не рисуете записи на сервере, а затем обновляете их. Вы отправляете серверу заявление на обновление. Вы сокращаете свои поездки пополам.
Надеюсь, это имело смысл.