VBA Recordset不返回所有字段

时间:2014-10-30 15:22:13

标签: sql vba ado recordset

我刚开始使用这个数据库,我遇到了一个小问题。 因此,这背后的主要思想是使用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。

3 个答案:

答案 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