为什么.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个字符,因此分裂了
字符串。 company_name
是56个字符'
),/* */
答案 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