使用Access 2007.我正在尝试编写一个VBA函数,该函数将根据我作为参数传递的表名,字段和值构造查询。我一直收到“运行时错误'3464':条件表达式中的数据类型不匹配。”
以下是代码:
Function getPrimaryFromForeign(db As Database, table As String, field As String, _
value As Long, _
field2 As String, value2 As Long) As Long
Dim sStr As String
Dim istr As String
Dim rs As Recordset
sStr = "select * from " & table & " where " _
& field & "='" & value & "' and " & field2 & "='" & value2 & "'"
istr = "insert into " & table & "(" & _
field & "," & field2 & ") values ('" & value & "','" & value2 & "')"
Set rs = db.OpenRecordset(sStr)
If rs.RecordCount < 1 Then
db.Execute (istr), dbFailOnError
Set rs = db.OpenRecordset(sStr)
End If
getPrimaryFromForeign = rs("id")
End Function
错误发生在以下行: 设置rs = db.OpenRecordset(sStr)
我认为它与Value和Value2的变量类型有关。但是我使用typename()检查了它们,并且在调用OpenRecordSet()时它们都是Long。查询位于表中,其中这两个字段的类型为Number。那么为什么会出现类型不匹配?
答案 0 :(得分:1)
我很长一段时间没有使用过Access,但我认为问题是因为你在SQL中用单引号括起Value
和Value2
语句,而不是括在括号中的WHERE子句中的字段。
试试这样:
sStr = "select * from " & table & " where [" _
& field & "] = " & value & " and [" & field2 & "] = " & value2
istr = "insert into " & table & "([" & _
field & "], [" & field2 & "]) values (" & value & "," & value2 & ")"
答案 1 :(得分:0)
如果引用库中同时包含DAO和ADO,则会发生这种情况。
在这种情况下,Dim语句和引用窗口中的声明顺序都很重要。
1)“您必须同时引用和使用DAO和ADO Recordset对象,并按如下所示明确定义对象的尺寸:
Dim adoRS As ADODB.Recordset
Dim daoRS As DAO.Recordset"
2)“确保“引用”对话框中DAO对象库的引用具有更高的优先级,或者清除对Microsoft ActiveX数据对象的引用。”