如何在 Where 子句中输入参数?

How to enter a parameter in a Where clause?

使用这个 VBA 代码我得到一个错误:

Too few parameters. Expected 1.

不知道怎么输入才对

Dim rs_invoice As DAO.Recordset
Set rs_invoice = CurrentDb.OpenRecordset("SELECT * FROM order_tbl WHERE invoice_no Is Null AND company_name='" _
 & Me.cmb_start_company.Column(1) & "' AND shiped=" & "True")


If Not (rs_invoice.EOF And rs_invoice.BOF) Then
    rs_invoice.MoveFirst
    Do Until rs_invoice.EOF = True
        rs_invoice.Edit
        rs_invoice!invoice_no = invoice_number
        rs_invoice.Update

        rs_invoice.MoveNext
    Loop
Else
   'No records
End If

'Finish


rs_invoice.Close 'Close the recordset
Set rs_invoice = Nothing 'Clean up

只是猜测。你能试试这个吗:

"SELECT * FROM order_tbl WHERE (invoice_no Is Null) AND (company_name='" _
 & Me.cmb_start_company.Column(1) & "' )AND (shiped=" & "True")

选项 2:

dim str_test as string
str_test =     "SELECT * FROM order_tbl WHERE (invoice_no Is Null) AND (company_name='" & Me.cmb_start_company.Column(1) & "' )AND (shiped=" & "True")

debug.print str_test

你会立即得到什么window?

选项 3:

  "SELECT * FROM order_tbl WHERE (invoice_no Is Null) AND (company_name='" _
     & Me.cmb_start_company.Column(1) & "' )AND (shiped=True)"

选项 4: 然后使用这里的示例,它应该可以工作。 https://msdn.microsoft.com/en-us/library/bb243786(v=office.12).aspx 大概吧。只要确保您以相同的方式设置记录集即可:

Dim dbsNorthwind As DAO.Database
Dim rstProducts As DAO.Recordset
Dim strSQL As String

Set dbsNorthwind = CurrentDb
strSQL = "SELECT * FROM Products WHERE Discontinued = No " & _
         "ORDER BY ProductName"
Set rstProducts = dbsNorthwind.OpenRecordset(strSQL)

我对 Access/DAO 不是很熟悉,但您将参数值连接到您的查询中。使用 ADO,您的命令文本将看起来像这样:

Const sql As String = "SELECT * FROM order_tbl WHERE invoice_no Is Null AND company_name = ? AND shiped = True"

?是一个参数值的占位符;而不是直接调用 OpenRecordset(sql),您需要创建一个 Command 并添加一个适当的 Parameter.

DAO 处理这个问题的方式似乎有点不同,参见 Parameterized queries in Access - surely one of the answers is applicable here. Because I don't like random ad-hoc queries hitting my databases I'd probably go with the QueryDefs approach in this answer:

Dim qdf As Querydef
Dim rst As Recordset

'then we'll open up the query:
Set qdf = CurrentDB.QueryDefs(qryname)

'Now we'll assign values to the query using the parameters option:
qdf.Parameters(0) = qryStartDate
qdf.Parameters(1) = qryEndDate

'Now we'll convert the querydef to a recordset and run it
Set rst = qdf.OpenRecordset

那就是:

Dim query As QueryDef
Set query = CurrentDB.QueryDefs("TheQuery")

query.Parameters(0) = Me.cmb_start_company.Column(1)

Dim result As Recordset
Set result = query.OpenRecordset