我正在使用此代码并获得类型不匹配错误,运行时错误“13”
错误在行中,标记如下,特别是错误是由于查询中的条件(prereq.paid=" + rs1!paid + " "
)...
rs1.Open "select name,nposts,postad.paid as paid from ad,post,postad where ad.adid = " +
cmbAdno.Text +
" and ad.adid=postad.adid and postad.pid=post.pid ", con, adOpenDynamic,
adLockOptimistic
While Not rs1.EOF
cmbTitle.AddItem (rs1!Name)
rs1.MoveNext
Wend
rs1.MoveFirst
cmbTitle.Text = rs1!Name
txtNposts.Text = rs1!nposts
If IsNumeric(rs1!paid) Then
MsgBox (rs1!paid + 1)
End If
**rs2.Open "select title from postad,prereq where postad.paid = prereq.paid and prereq.paid=" +
rs1!paid + " ", con, adOpenDynamic, adLockOptimistic**
While Not rs2.EOF
lstPrereq.AddItem (rs2!Title)
rs2.MoveNext
Wend
rs2.Close
rs1.Close
答案 0 :(得分:5)
哇,那段代码需要一些工作!
加号运算符是这里的罪魁祸首。您可以使用小型测试用例轻松验证这一点。
Dim ADO_Field_Value As Variant
Dim S As String
ADO_Field_Value = True
On Error Resume Next
S = "text" + ADO_Field_Value + ""
If Err Then MsgBox "Plus failed, err " & CStr(Err)
Err.Clear
S = "text" & ADO_Field_Value & ""
If Err Then MsgBox "Amp failed, err " & CStr(Err)
如果你运行这个" +" "&"产生错误13按预期工作。
使用&符号进行连接。唯一的分类,有点与古代的向后兼容。使用它需要编译器猜测你的意图,以便解决操作符的软重载。
你的" Null hack"将空字符串连接到.Value并不是特别聪明。如果rs1有一个Null,你最终会得到一个SQL语法错误,除非你使用" +"这会给你一个错误94。
通过显式使用.Value而不是让编译器猜测你想要Field的默认属性,ADO字段值更安全。虽然/ Wend已经过时了,那些无关的括号是什么?
您要求编译器执行此代码中可能不应该执行的操作。
答案 1 :(得分:0)
是rs1!在数据库中支付了一个布尔值?如果是这样,可能是concat存在查询字符串的问题。 在过去,当我使用VB6时,我从未访问过这样的字段。我使用了类似rstRecordSet.Fields(0)或rstRecordSet.Fields(“field1”)的东西,但如果该字段存在则不应该是问题。 之前创建一个字符串并将其传递给查询的串联并验证它是否已被填充。
另外,你有“... postad.paid as paid ......”,为什么?你不需要在那里重命名那个......