如何在 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
使用这个 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