VB6 recordset.open没有为一个或多个参数错误提供值

VB6 recordset.open没有为一个或多个参数错误提供值,vb6,Vb6,rs.open语句有什么问题??? 它以一种特殊的形式完美地为我工作。 但它以另一种形式给出了一个运行时错误:一个或多个参数没有给出值…问题几乎肯定是Form4.List2.Text的值 假设值为单个字母a。然后,动态SQL将是 Dim adoconn As New ADODB.Connection Dim rs As New ADODB.Recordset Private Sub Form_Load() Dim str As String Set adoconn = Nothing Text

rs.open
语句有什么问题??? 它以一种特殊的形式完美地为我工作。
但它以另一种形式给出了一个运行时错误:一个或多个参数没有给出值…

问题几乎肯定是
Form4.List2.Text的值

假设值为单个字母
a
。然后,动态SQL将是

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
假设表
dept
中没有名为
a
的列,则Access(Jet、ACE等)会将其视为一个参数,并且由于您没有提供与该参数相关的值,因此会出现错误,“没有为一个或多个必需参数提供值。”

因为您正在经历动态SQL的一些问题(更不用说其他的,如在<代码>中的SQL注入,其中子句),考虑使用ADO命令对象在VBA代码中执行强类型的参数来创建数据库<代码>过程/> >,例如假设“代码> DEPT < /代码>是代码>整数< /代码>:

要执行一次的SQL代码(在中):

VBA代码:

CREATE PROCEDURE GetDept
(
 arg_dept INTEGER
)
AS
SELECT *
  FROM DEPT 
 WHERE dept = arg_dept;
Private子表单_Load()
Text2.Text=Form4.List2.Text
以猫为对象
设置cat=CreateObject(“ADOX.Catalog”)
cat.ActiveConnection=_
“Provider=Microsoft.Jet.OLEDB.4.0;数据源=Database1.mdb;持久安全信息=False”
Dim命令
Set cmd=cat.Procedures(“GetDept”)命令

cmd.Parameters(0).Value=List2.Text'我有这个错误,它的基本意思是在传递给Access数据库的SQL中存在语法错误,这意味着Access无法识别传递给它的一个或多个参数。详情载于

最可能出现错误的地方是传递的附加字符串“Form4.List2.Text”。最简单的方法是直接在Access中运行查询,您应该会看到“输入参数值”对话框出现,这基本上意味着Access无法识别传递给它的一个或多个字段/值名称。Access似乎有一种习惯,即改变字段名称的外观,以防不小心,例如,表视图中显示的公司/部门实际上是查询中的公司/部门


希望这有帮助。

您确定
Form4.List2.Text
有用于完成查询的值吗?表单引用是否正确?是的…它是正确的。我从Form4中的列表框中获取值。同样的编码对我来说在Form3中工作正常。在我的情况下,该值不是一个字母。问题不是该值是一个或多个信件。问题是select语句不知道要比较的值是字符串值。有些撇号可能会有所帮助,尽管它们会使语句容易受到SQL注入攻击。
CREATE PROCEDURE GetDept
(
 arg_dept INTEGER
)
AS
SELECT *
  FROM DEPT 
 WHERE dept = arg_dept;
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