使用查询检索记录
查询可以通过两种方式执行,这两种方式都返回 ADO Recordset
对象,该对象是返回行的集合。请注意,下面的两个示例都使用了 “连接到数据源 ”示例中的 OpenDatabaseConnection
函数,以简洁起见。请记住,传递给数据源的 SQL 的语法是特定于提供者的。
第一种方法是将 SQL 语句直接传递给 Connection 对象,这是执行简单查询的最简单方法:
Public Sub DisplayDistinctItems()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim records As ADODB.Recordset
Set records = database.Execute("SELECT DISTINCT Item FROM Table")
'Loop through the returned Recordset.
Do While Not records.EOF 'EOF is false when there are more records.
'Individual fields are indexed either by name or 0 based ordinal.
'Note that this is using the default .Fields member of the Recordset.
Debug.Print records("Item")
'Move to the next record.
records.MoveNext
Loop
End If
CleanExit:
If Not records Is Nothing Then records.Close
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
第二种方法是为要执行的查询创建 ADO Command
对象。这需要更多代码,但是为了使用参数化查询是必要的:
Public Sub DisplayDistinctItems()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim query As ADODB.Command
Set query = New ADODB.Command
'Build the command to pass to the data source.
With query
.ActiveConnection = database
.CommandText = "SELECT DISTINCT Item FROM Table"
.CommandType = adCmdText
End With
Dim records As ADODB.Recordset
'Execute the command to retrieve the recordset.
Set records = query.Execute()
Do While Not records.EOF
Debug.Print records("Item")
records.MoveNext
Loop
End If
CleanExit:
If Not records Is Nothing Then records.Close
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
请注意,发送到数据源的命令容易受到 SQL 注入的攻击,无论是有意还是无意。通常,不应通过连接任何类型的用户输入来创建查询。相反,它们应该参数化(请参阅创建参数化命令 )。