Обновление набора записей VB6 - PullRequest
0 голосов
/ 05 января 2012

Я запускаю программу 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 ]

1 голос
/ 12 апреля 2013

Простой ответ: выньте оператор DoEvents. Если вы используете его для обновления экрана, периодически выполняйте ручное обновление вашего графического интерфейса после, скажем, 1000 итераций цикла.

Причина, по которой это может вызывать проблему, заключается в том, что другой код, который вы не можете контролировать, может выполняться при вызове DoEvents.

1 голос
/ 06 января 2012

Ну, вы можете значительно сократить объем работы 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 лет), загружают исходный набор записей вашей записи, проверяют значение и, если это значение не равно NULL, запустив второе, выберите ТО обновление набор записей .... Вы можете вместо всего этого просто создать объект команды Объявите это перед своими циклами 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

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

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

...