Обновление набора записей 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 objCommset 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

как вы видите, ваш оператор выбора все еще там, это вспомогательный выбор, преимущество огромно, вы не рисуете записи на сервере, а затем обновляете их. Вы отправляете серверу заявление на обновление. Вы сокращаете свои поездки пополам.

Надеюсь, это имело смысл.

Другие вопросы по тегам