【发布时间】:2016-06-22 08:33:41
【问题描述】:
我只是想用 MySQL 制作一个玩具数据库并通过 VBA 将其导入 Excel。 当我使用 MySQL 的 Excel 插件时很好,但是当我尝试通过 VBA 自动化它时,它正确导入了除 Decimal(65,30) 之外的所有列,这些列在 myArray 中显示为“空”值。 代码:
Sub DBUpdate()
ThisWorkbook.Worksheets("data").Cells.ClearContents
Dim Password As String
Dim SQLStr As String
Dim Server_Name As String
Dim User_ID As String
Dim Database_Name As String
Set rs = CreateObject("ADODB.Recordset") 'EBGen-Daily'
With ThisWorkbook.Worksheets("DB")
Server_Name = .Range("IPaddress").Value
Database_Name = .Range("DBname").Value 'Name of database'
User_ID = .Range("userID").Value 'id user or username'
Password = .Range("password").Value 'Password'
SQLStr = "SELECT * FROM trade_details"
End With
Set Cn = CreateObject("ADODB.Connection") 'NEW STATEMENT
Cn.Open "Driver={MySQL ODBC 5.2 ANSI Driver};Server=" & _
Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open SQLStr, Cn, adOpenStatic
Dim myArray()
myArray = rs.GetRows()
nCols = UBound(myArray, 1)
nRows = UBound(myArray, 2)
For K = 0 To nCols ' Using For loop data are displayed
' header
Range("b1").Offset(0, K).Value = rs.Fields(K).Name
' row data
For R = 0 To nRows
'Range("b2").Offset(R, K).Value = myArray(K, R)
ThisWorkbook.Worksheets("data").Cells(R, K).Value = myArray(K, R)
Next
Next
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub
我注意到的一件事是,真正的空值显示为'NULL',但数字显示为'Empty',类型为 '变体/空'.
我还读到 Excel 默认只扫描前 8 行以确定列类型。但是我从第一行开始填充数据(即使是这种情况,它也不能是“空的”对吗?)
系统规格:
- Win10 64位
- Office 2013
- 64 位 MySQL
- 服务器 5.7
- MySQL ODBC 5.2 ANSI 驱动程序
我真的很困惑,因为一切都是库存配置,我什至知道这是来自 Excel/VBA 端还是 MySQL/ODBC 端,当我用谷歌搜索时,甚至没有一个人遇到这个问题。 任何意见表示赞赏。
【问题讨论】:
-
为什么要使用数组?考虑CopyFromRecordset?
-
此外,该列类型非常大 - max of MySQL:最多 65 位和最多 30 个小数点位。尝试使用 double type 定义数组以适应。整数或长类型太有限了。
-
我能够重现您的错误并通过将小数调整为 (10,7) 来解决。您是否有理由在 MySQL 的最大值下需要如此高的整数值和小数精度?
-
非常感谢冻糕!我想我也会采用那个解决方案。
标签: mysql excel vba odbc decimal