Dim adoconn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Sub Form_Load()
Dim str As String
Set adoconn = Nothing
Text2.Text = Form4.List2.Text
adoconn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb;Persist Security Info=False"
str = "select * from dept where DEPT =" & Form4.List2.Text
rs.Open str, adoconn, adOpenDynamic, adLockPessimistic
Text1.Text = rs(2)
End Sub
rs.open
陈述怎么了?
它完美地以一种特定的形式为我工作。
但是它以另一种形式给出了运行时错误:没有给出一个或多个参数的值......
答案 0 :(得分:1)
问题几乎肯定是Form4.List2.Text
的价值。
假设该值为单个字母a
。然后动态SQL将是
SELECT *
FROM dept
WHERE DEPT = a;
假设表dept
中没有名为a
的列,则Access(Jet,ACE,等等)会将其视为参数,因为您没有提供任何值来使用该参数,你得到错误,“没有给出一个或多个必需参数的值。”
当您遇到动态SQL的一些问题时(更不用说WHERE
子句中的SQL注入等其他问题),请考虑创建一个数据库PROCEDURE
,其中包含要在其中执行的强类型参数使用ADO Command对象的VBA代码,例如假设DEPT
为INTEGER
:
要执行一次的SQL代码(在ANSI-92 Query Mode中):
CREATE PROCEDURE GetDept
(
arg_dept INTEGER
)
AS
SELECT *
FROM DEPT
WHERE dept = arg_dept;
VBA代码:
Private Sub Form_Load()
Text2.Text = Form4.List2.Text
Dim cat As Object
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb;Persist Security Info=False"
Dim cmd
Set cmd = cat.Procedures("GetDept").Command
cmd.Parameters(0).Value = List2.Text ' <--- test for type mismatch here '
Set rs = cmd.Execute
Text1.Text = rs(2)
End Sub
其他注意事项是将SELECT *
替换为列名列表,按名称引用Recordset Fields(而不是按序号)并处理零行的记录集。
答案 1 :(得分:0)
我遇到了这个错误,它基本上意味着您传递给Access数据库的SQL中存在语法错误,这意味着Access无法识别传递给它的一个或多个参数。详细信息见http://support.microsoft.com/kb/303134。
错误的最可能位置是您传递“Form4.List2.Text”的附加字符串。最简单的方法是在Access中直接运行查询,您会看到出现“输入参数值”对话框,这意味着访问权限无法识别传递给它的一个或多个字段/值名称。访问似乎习惯于改变字段名称的外观以找出不谨慎的例如。表格视图中显示的公司/部门实际上是关于查询的CompanyorDepartment。
希望这有帮助。