.CopyFromRecordset正在截断粘贴到Excel中的数据

时间:2016-11-01 14:21:08

标签: mysql excel vba adodb

问题

为什么.CopyFromRecordset从记录集输出中截断字符串?

之前我曾多次使用.CopyFromRecordset并且没有遇到过这个问题,但由于某种原因,这个VBA代码导致我的字符串数据被截断。我目前使用的代码如下:

当前代码

Sub GetTable()

Dim myConnObj As ADODB.Connection
Dim myRecSet As ADODB.Recordset
Dim SQLStr As String
Dim eRow As Long

/*Open connection to database*/
Set myConnObj = CreateObject("ADODB.Connection")
myConnObj.Open _
    "Driver={MySQL ODBC 5.3 ANSI Driver}; " & _
    "Server=SERVERNAME; " & _
    "Database=DATABASENAME; " & _
    "Uid=ID; " & _
    "Pwd=PASSWORD; " & _
    "Option=3"

/* Set SQL string */
SQLStr = "SELECT t.field1, t.field2, t.field3, t.field4, t.field5, t.field6, NULL as field7 "
SQLStr = SQLStr & "FROM table AS t WHERE ISNULL(t.field4) AND NOT ISNULL(t.field5) GROUP BY t.field3;"

/* Open recordset */
Set myRecSet = CreateObject("ADODB.Recordset")
myRecSet.Open SQLStr, myConnObj, adOpenStatic

/* Set end row */
eRow = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

/* Clear current range */
ThisWorkbook.Sheets("Sheet1").Range("A2:G" & eRow).ClearContents

/* Copy data into worksheet */
ThisWorkbook.Sheets("Sheet1").Range("A2").CopyFromRecordset myRecSet

/* Close off objects */
Set myRecSet = Nothing
myConnObj.Close
Set myConnObj = Nothing

End Sub

当前输出

此代码的输出如下所示:

provider_name     id              company_name
ABC               AA1234          Example Limited
ABC               AB1231          Another Example Limited
ABC               AC1235          Another Company Example L
DEF               AA1238          E.g. Limited
GF&               AB1261          Final Example Company Lim

无论出于何种原因,每个单元格都会被填充,provider_name被截断为3个字符,company_name被截断为25个字符。

编辑:由于这些(正确)的所有数据都返回了NULL值,因此我遗漏了4-7字段。

期望输出

我的输出应如下所示:

provider_name     id              company_name
ABC               AA1234          Example Limited
ABCDEF            AB1231          Another Example Limited
ABC               AC1235          Another Company Example Ltd
DEFGHI            AA1238          E.g. Limited
JK&L              AB1261          Final Example Company Limited

我尝试过什么

SQL查询在我的SQL管理程序(HeidiSQL)中执行时工作正常 - 没有数据被截断。更奇怪的是,当我打开记录集后运行这行代码时:

Debug.Print myRecSet.GetString

没有数据被截断!仅当我使用.CopyFromRecordset数据被截断时才会这样做。

其他信息

  • 我的实际SQLStr长度为313个字符,因此分裂了 字符串。
  • 我的实际查询只生成86行和7列。
  • 最长的company_name是56个字符
  • 我的实际评论使用单数撇号('),
    评论 不是/* */

1 个答案:

答案 0 :(得分:1)

我已经弄明白了!

如果你找到了自己问题的答案,我不确定这个过程是什么,但是我在这里发布答案,这有助于其他人或那些好奇的人...

从我在VBA上添加myRecSet到我的监视列表后,我注意到CursorLocation值已设置为adUseServer。在最初寻找解决方案的同时,我记得看到这通常设置为adUseClient而不是adUseServer

在打开记录集之前将CursorLocation值设置为adUseClient,然后重新运行代码,导致我的输出正常,没有截断!

更改为我的代码:

/* Open recordset */
Set myRecSet = CreateObject("ADODB.Recordset")
myRecSet.CursorLocation = adUseClient  /* <--Added Code */
myRecSet.Open SQLStr, myConnObj, adOpenStatic