簡體   English   中英

VBA Recordset不會返回所有字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM