VB6 recordset.open没有给出一个或多个参数错误的值

时间:2011-03-14 08:16:22

标签: vb6

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陈述怎么了? 它完美地以一种特定的形式为我工作。 但是它以另一种形式给出了运行时错误:没有给出一个或多个参数的值......

2 个答案:

答案 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代码,例如假设DEPTINTEGER

要执行一次的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。

希望这有帮助。