如何将DLookup获取的TypeID值插入Access数据表?
解决你的Access VBA代码问题
我来帮你一步步梳理代码里的问题,搞定这个插入和查找的需求:
首先解决DLookup的「参数不足」错误
你之前的DLookup条件里直接引用窗体控件的写法,Access没法正确解析成查询条件,导致参数缺失。应该把控件的实际值拼接到条件字符串里(注意文本字段要加单引号):
Dim varx As Variant varx = DLookup("TypeID", "[Copy Of tblTypeOfAsset]", _ "[Manufacturer] = '" & Me.CBOFirm & "' " & _ "And [Model] = '" & Me.CBOComms & "' " & _ "And [Version] = '" & Me.CBOSpSettings & "'")
这样就能正确生成查询条件,找到对应的TypeID了。
然后解决插入varx到[1test]表的问题
你之前的错误有两个:
- 表名
1test是数字开头,Access要求必须用方括号[1test]括起来,否则会被当成语法错误; - 你用
'varx'会把字符串"varx"插入,而不是变量的值,要把变量和SQL字符串拼接,还要根据TypeID的类型决定是否加单引号:- 如果TypeID是数值类型(比如自动编号、整数):
' 先判断varx不为空,避免插入空值出错 If Not IsNull(varx) Then CurrentDb.Execute "INSERT INTO [1test] (test) VALUES (" & varx & ");" Else MsgBox "未找到对应的TypeID,请检查输入!" End If - 如果TypeID是文本类型:
If Not IsNull(varx) Then CurrentDb.Execute "INSERT INTO [1test] (test) VALUES ('" & varx & "');" Else MsgBox "未找到对应的TypeID,请检查输入!" End If
- 如果TypeID是数值类型(比如自动编号、整数):
修正后的完整代码
Private Sub Button_Click() ' 插入第一条记录到[Copy Of tblTypeOfAsset] CurrentDb.Execute "INSERT INTO [Copy Of tblTypeOfAsset](Manufacturer, Model, Version, CalInterval) " & _ "Values ('" & Me.CBOFirm & "','" & Me.CBOComms & "' , '" & Me.CBOSpSettings & "','" & Me.CBOConfigP & "');" ' 查找对应的TypeID Dim varx As Variant varx = DLookup("TypeID", "[Copy Of tblTypeOfAsset]", _ "[Manufacturer] = '" & Me.CBOFirm & "' " & _ "And [Model] = '" & Me.CBOComms & "' " & _ "And [Version] = '" & Me.CBOSpSettings & "'") ' 插入TypeID到[1test]表 If Not IsNull(varx) Then CurrentDb.Execute "INSERT INTO [1test] (test) VALUES (" & varx & ");" Else MsgBox "未找到对应的TypeID,请检查输入!" End If End Sub
额外优化建议(更安全的写法)
如果控件值里可能包含单引号(比如厂商名字里有O'Neil),直接字符串拼接会导致SQL语法错误,建议用参数化查询代替,比如插入第一条记录可以改成:
Dim qd As QueryDef Set qd = CurrentDb.CreateQueryDef("", _ "INSERT INTO [Copy Of tblTypeOfAsset](Manufacturer, Model, Version, CalInterval) " & _ "VALUES (@Manu, @Model, @Ver, @CalInt);") qd.Parameters("@Manu") = Me.CBOFirm qd.Parameters("@Model") = Me.CBOComms qd.Parameters("@Ver") = Me.CBOSpSettings qd.Parameters("@CalInt") = Me.CBOConfigP qd.Execute dbFailOnError Set qd = Nothing
这种写法能避免SQL注入,也不会因为特殊字符报错。
内容的提问来源于stack exchange,提问作者Josh Alt
相关产品推荐
相关产品推荐

