[英]VBA Recordset doesn't return all fields
我剛開始使用此數據庫,但是有一個小問題。 因此,這背后的主要思想是使用VBA從數據庫中獲取所需的信息,以便以后使用。 我正在使用ADO記錄集並連接字符串以連接到服務器。 除一個問題外,一切都很好:當我通過使用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
目前,由於只有兩行具有相同的OrderID,因此Debug僅應返回一個結果,而應返回兩個結果。
記錄集一次只打開一個記錄。 您正在遍歷單個記錄中的所有字段。 不是記錄集中的每個記錄。
如果查詢返回兩個記錄,則需要告訴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
包括要返回的任何其他字段 。
您正在混淆問題中的術語,這使其不清楚
在您的第一段中,描述了“字段”的問題,在最后一段中,將其變成“行”。 不完全一樣。
但是,無論您要實現什么目標,編寫的代碼只會返回一個字段和一行。
如果需要所有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
除了@enderland的答案之外,您還可以斷開記錄集的連接,該記錄集具有可供使用的所有值和字段。 當您需要傳遞數據或需要快速關閉連接時,它非常方便。
這是一個返回未連接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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.