VB6 Recordset更新

时间:2012-01-05 17:59:25

标签: vb6 ado recordset

我正在运行一个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 个答案:

答案 0 :(得分:1)

那么你可以在这里大大减少你的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

你本质上,它看起来对我(我10年没有使用VB6和ADO),加载你的记录初始记录集,检查一个值,如果该值不是null运行第二个选择THEN更新记录集.... 你可以代替完成所有这些只是创建一个命令对象 在循环之前声明这些 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

你的select语句仍然存在,你可以看到,它现在是一个子选择,优点是巨大的,你不是将记录绘制到服务器,然后更新它们。您正在向服务器发送声明以进行更新。你把旅行减少了一半。

希望这是有道理的。

答案 1 :(得分:1)

简单回答:取出DoEvents声明。如果您正在使用它来刷新屏幕,那么在循环的1000次迭代之后定期手动刷新GUI。

这可能导致问题的原因是,当您调用DoEvents时,可能无法控制的其他代码可能正在被执行。