0

我正在使用此代码并收到类型不匹配的错误,运行时错误“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
4

2 回答 2

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,而“&”会按预期工作。

使用 & 符号进行连接。plus only sorta,有点适用于与古代的向后兼容性。使用它需要编译器猜测您的意图,以解决运算符的软重载问题。

您将空字符串连接到 .Value 的“Null hack”并不是特别聪明。如果 rs1 有一个空值,你最终会出现 SQL 语法错误,除非你使用“+”,它会得到一个错误 94。

通过显式使用 .Value 而不是让编译器猜测您想要该字段的默认属性来访问 ADO 字段值更安全。While/Wend 已经过时了,那些多余的括号是怎么回事?

您要求编译器执行此代码中可能不应该执行的操作。

于 2012-06-03T12:55:16.393 回答
0

rs1!paid 是数据库中的布尔值吗?如果是这样,则 concat 可能存在用于制作查询字符串的问题。在过去,当我使用 VB6 时,我从未访问过这样的字段。我使用了类似 rstRecordSet.Fields(0) 或 rstRecordSet.Fields("field1") 的东西,但如果该字段存在,那应该不是问题。在之前创建一个字符串并将查询的连接传递给它并验证它是否被填充。

另外,您有“...postad.paid aspaid...”,为什么?你不需要重命名那里的字段......

于 2012-06-03T12:21:22.270 回答