我正在重写一些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
我知道这可能非常明显,但我想确定:Sub&#34; InsertValue&#34;在这段代码中永远不会被调用吗?我的意思是当Recordset读取时bool设置为true。是否有一个VB6或Recordset特定的规则我不知道会使&#34; blnValue1&#34;在某些时候是假的?
我无法运行旧的VB6代码来检查它是否到达&#34; InsertValue&#34; Sub因为它访问了我不想搞砸的生产文件,直到对代码所做的每件事都有一个完美的处理。
答案 0 :(得分:6)
我的第一直觉是,如果sql查询没有返回任何结果, 可以调用InsertValue
函数。无论实际发生了什么,我相信这是作者的意图。
在进一步思考时,我对第一次调用EOF
之前没有为RecordSet设置MoveNext
的问题有一个模糊的怀疑 - 类似于文件流不是如何设置它直到你尝试读取文件的末尾 - 所以我去了documentation。阅读此内容,如果没有结果,则EOF
设置为True
:
如果打开不包含记录的Recordset对象,则BOF和EOF属性设置为True,Recordset对象的RecordCount属性设置为0.
因此,我的初始本能得到了证实。 在查询未返回任何结果的情况下,将调用InsertValue
方法。
在使用此代码时,您应该修复那个令人讨厌的SQL注入漏洞。