【问题标题】:CopyFromRecordset Returning Strange CharactersCopyFromRecordset 返回奇怪的字符
【发布时间】:2017-07-04 19:54:59
【问题描述】:

我有以下代码:

Function downloadsqltoexcel(conn As ADODB.Connection, sSQL As String, exceldestinationrangename As String, sqltablename As String, bDownload As Boolean, Optional ws As Worksheet) As Variant

'================================================================================================================================
'== Procedure Name: downloadsqltoexcel
'== Purpose: downloads SQL table data (or query data) to Excel named range or grabs a specific value from an SQL table
'== Notes: ensure that SQL table or query name and Excel named range are identical
'================================================================================================================================

Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset

Dim DestinationRange As Range

With rsPubs

    .ActiveConnection = conn
    .Open sSQL, conn, adOpenStatic, adLockReadOnly, adCmdText

    If bDownload Then 'if download switch is on, dump into Excel named range

        If ws Is Nothing Then
            Set DestinationRange = Range(exceldestinationrangename)
        Else
            Set DestinationRange = ws.Range(exceldestinationrangename)
        End If

        With DestinationRange
            .ClearContents
            .CopyFromRecordset rsPubs
        End With

   .... more code follows, but not relevant

代码本身执行良好。但是,当我指向新创建的 Prod SQLServer 数据库时,.CopyFromRecordset rsPubs 行返回了非常奇怪的字符数据,该数据库也是直接从 SQLServer 中的 QA 数据库复制的。当我说非常奇怪时,我的意思是像空格混合了日式风格我什至不认识的字符或字体集。

rsPubs 按预期返回准确的记录数,所以我知道我得到了我想要的结果。还确认根据需要将数据写入 SQLServer DB。

任何想法如何解决它,以便值从调用 Prod SQLServer DB 时按预期返回?

【问题讨论】:

  • 您的exceldestinationrangename 是单个单元格还是多个单元格范围?如果我没记错的话,范围需要是左上角的单元格only.
  • @ThunderFrame - 谢谢,但这不是问题。范围是单个单元格。此外,正如我的问题所述,当指向 QA DB 时,它运行良好。
  • 如果您循环播放记录并输出到即时窗口,您会得到什么?一样的吗?
  • @Absinthe - 已经有一段时间了,但我相信当我循环浏览时,即时窗口显示了每条记录的正确结果。我最终在我的最终解决方案中做到了这一点(但从未回答过这个问题,因为它已经不在我的脑海中了)。感谢您的评论。现在我可以清理这个问题并提供一个可持续的答案)。
  • @ScottHoltzman 抱歉,没有注意到发布日期,只是浏览了未答复的部分。为了将来参考,我建议查看表格的文本编码。很高兴您解决了这个问题。

标签: sql-server vba excel sql-server-2008 adodb


【解决方案1】:

我也遇到过类似的问题,我强烈怀疑您的 RecordSet 中返回的记录数量非常大。因此,CopyFromRecordSet 不起作用。

我建议使用以下方法:

  1. 用 RecordSet 数据填充 VBA 中的二维数组。

    将 arr 调暗为 Variant arr=rs.GetRows() rs.close conn.close

  2. 转置数组(因为这会导致反转数组)

    arr=Application.WorksheetFunction.Transpose(arr)

  3. 一旦数组被转置,您就可以将数组写入工作表范围。

    testWS.Range("A1").Resize(UBound(arr, 1) + 1, UBound(arr, 2)

这对我有用。希望这对你有用!

编码愉快!

【讨论】:

    【解决方案2】:

    我最终遍历记录集并将每个值一个接一个地放置。也就是说,提供的数组答案对于大型数据集可能会更快。当时,这符合我的需要并且有效。

    If bDownload Then 'if download switch is on, dump into Excel named range
    
                If ws Is Nothing Then
                    Set DestinationRange = Range(exceldestinationrangename)
                Else
                    Set DestinationRange = ws.Range(exceldestinationrangename)
                End If
    
                r = 0
    
                DestinationRange.ClearContents
                '.CopyFromRecordset rsPubs 'this is breaking on PDLOBList download (last column not showing up) 'PAQPT-488
    
                If .RecordCount > 0 Then
                    .MoveFirst
                    Do Until .EOF
                        For c = 0 To .Fields.Count - 1
                            DestinationRange.Offset(r, c).value = .Fields(c)
                        Next
                        .MoveNext
                        r = r + 1
                    Loop
    

    (我省略了其余的 if 块,因为它们与此答案无关。)

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 2018-03-11
      • 2019-07-27
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多