我刚开始使用这个数据库,我遇到了一个小问题。 因此,这背后的主要思想是使用VBA从数据库中获取所需的信息,以后我可以使用。 我正在使用ADO记录集并连接sting连接到服务器。除了一个问题之外,一切都很好:当我使用SQL请求创建RecordSet时,它只返回一个字段,当我知道应该有更多时。目前我认为RecordSet只是抓取第一个结果并将其存储,但丢失了应该存在的任何其他内容。你能帮我吗?
这是我的代码:
'Declare variables'
Dim objMyConn As ADODB.Connection
Dim objMyCmd As ADODB.Command
Dim objMyRecordset As ADODB.Recordset
Dim fldEach As ADODB.Field
Dim OrderNumber As Long
OrderNumber = 172783
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=Local;" & _
"Initial Catalog=SQL_LIVE;"
objMyConn.Open
'Set and Excecute SQL Command'
Set objMyCmd.ActiveConnection = objMyConn
objMyCmd.CommandText = "SELECT fldImage FROM tblCustomisations WHERE fldOrderID=" & OrderNumber
objMyCmd.CommandType = adCmdText
'Open Recordset'
Set objMyRecordset.Source = objMyCmd
objMyRecordset.Open
objMyRecordset.MoveFirst
For Each fldEach In objMyRecordset.Fields
Debug.Print fldEach.Value
Next
当Debug返回两个时,Debug只返回一个结果,因为有两行具有相同的OrderID。
答案 0 :(得分:1)
记录集一次只能打开一条记录。您正在遍历单个记录中的所有字段。不是记录集中的每条记录。
如果您的查询返回两条记录,则需要告诉Recordset前进到下一条记录。
查询返回一个记录集,其记录数 某些字段数
您只是为返回记录集中的一条记录迭代字段。
你可以通过几种方式做到这一点,但我通常会这样做:
objMyRecordset.MoveFirst
Do
If Not objMyRecordset.EOF Then
debug.print "Record Opened - only returning 1 field due to SQL query"
For Each fldEach In objMyRecordset.Fields
Debug.Print fldEach.Value
Next
'this moves to the NEXT record in the recordset
objMyRecordset.MoveNext
Else
Exit Do
End If
Loop
请注意,如果您想要包含更多字段,则需要修改此行:
objMyCmd.CommandText = "SELECT fldImage FROM tblCustomisations WHERE fldOrderID=" & OrderNumber
要包含您想要返回的其他字段。
答案 1 :(得分:0)
您正在混淆问题中的条款,这使得不清楚
在你的第一段中,你描述了"字段"的问题,在最后一段你把它变成"行"。不完全一样。
但无论你想要实现什么,你编写的代码只返回一个字段和一行。
如果您想要所有FIELDS,您的查询应该是:
objMyCmd.CommandText = "SELECT * FROM tblCustomisations WHERE fldOrderID=" & OrderNumber
如果你想要所有的ROWS,你的循环应该是:
objMyRecordset.MoveFirst
If Not objMyRecordset.BOF Then
While Not objMyRecordset.EOF
debug.print objMyRecordset!fldImage
RS.MoveNext
Wend
End If
答案 2 :(得分:0)
除了@ enderland的答案之外,您还可以拥有一个断开连接的RecordSet,它具有可供使用的所有值和字段。当您需要传递数据或需要快速关闭连接时,它非常方便。
这是一个返回断开连接的RecordSet的函数:
Function RunSQLReturnRS(sqlstmt, params())
On Error Resume next
' Create the ADO objects
Dim rs , cmd
Set rs = server.createobject("ADODB.Recordset")
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = sqlstmt
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Execute the query for readonly
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
If err.number > 0 then
BuildErrorMessage()
exit function
end if
' Disconnect the recordset
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Set rs.ActiveConnection = Nothing
' Return the resultant recordset
Set RunSQLReturnRS = rs
End Function