【问题标题】:VBA Recordset doesn't return all fieldsVBA 记录集不返回所有字段
【发布时间】:2014-10-30 15:22:13
【问题描述】:

我刚开始使用这个数据库,我遇到了一个小问题。 所以这背后的主要思想是使用 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 只返回一个结果,而它应该返回两个结果,因为有两行具有相同的 OrderID。

【问题讨论】:

    标签: sql vba ado recordset


    【解决方案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
    

    包含您想要返回的任何其他字段

    【讨论】:

    • 感谢,当我阅读更多关于记录集的内容时,我理解了我的错误。您的回答很有帮助。
    【解决方案2】:

    除了@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
    

    【讨论】:

    • 谢谢你的回答也很有用。我也认为这条线不是必需的:collectParams cmd, params
    • 是的,collectParams 这是一个自定义函数,它接受一个数组并将参数插入到命令中。
    【解决方案3】:

    您在问题中混淆了术语,这使其不清楚

    在您的第一段中,您描述了“字段”的问题,在最后一段中,您将其变成了“行”。不完全一样。

    但无论您要实现什么目标,您编写的代码都只会返回一个字段和一行。

    如果您想要所有字段,您的查询应该是:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多