我正在运行一个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
答案 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时,可能无法控制的其他代码可能正在被执行。