我正在重写一些VB6遗留程序并运行以下代码(变量名称已更改为安全性)...
Dim blnValue1 As Boolean
Dim strForValue As String
sqlQuery = "SELECT a.* FROM databaseName a " & _
"WHERE a.ssn = '" & strInput1 & "'" & _
" and a.column2 = '" & strInput2 & "'"
Set rsInsert = New ADODB.Recordset
rsInsert.Open sqlQuery, Connection
blnValue1 = False
Do Until rsInsert.EOF
strForValue = Trim(rsInsert("value"))
If strForValue <> "1234" Then
[some unimportant code here]
End If
blnValue1 = True
rsInsert.MoveNext
Loop
If blnValue1 = False Then
InsertValue
End If
Run Code Online (Sandbox Code Playgroud)
我知道这可能很明显,但我想确定:在这段代码中永远不会调用Sub"InsertValue"吗?我的意思是当Recordset读取时bool设置为true.是否存在VB6或Recordset特定规则,我不知道会在某些时候使"blnValue1"错误?
我无法运行旧的VB6代码来检查它是否到达"InsertValue"Sub,因为它访问了我不想搞砸的生产文件,直到对代码所做的一切都有一个完美的处理.
我的第一反应是,这将有可能调用InsertValue函数如果SQL查询没有返回任何结果.无论实际发生什么,我相信这是作者的意图.
但是,在进一步反思时,我EOF对第一次调用之前没有为RecordSet设置的问题有一个模糊的怀疑MoveNext- 类似于文件流在您尝试读取文件末尾之前没有设置它的方式 -所以我去了文档.读这篇文章,它看起来像EOF 被设置为True如果没有结果:
如果打开不包含记录的Recordset对象,则BOF和EOF属性设置为True,Recordset对象的RecordCount属性设置为0.
因此,我的初始本能得到了证实.在查询未返回任何结果的情况下,将调用该InsertValue方法.
在使用此代码时,您应该修复那个令人讨厌的SQL注入漏洞.