长时间观看者第一次海报.我正在研究一个带有Excel前端的数据库应用程序.因此我使用VBA访问MySQL数据库.我正在使用的驱动程序是ODBC驱动程序(Windows),我有一个有效的数据库连接,因为许多其他查询运行良好.
我要做的是从一系列SQL语句中返回结果,而不是试图将它们全部组合成一个大型语句(这可能会起作用但很难维护/理解).我已将标志添加FLAG_MULTI_STATEMENTS = 67108864到连接字符串,以抑制驱动程序语法错误.
但现在我运行以下内容:
queryDB.Open SQLquery, conn
Run Code Online (Sandbox Code Playgroud)
在recordset (queryDB)保持与没有明显的错误关闭.可以在此处找到sql语句.
我可能会产生没有返回给VBA的错误,所以在这里提供任何帮助都会非常感激.
注意:sql语句工作,因为我可以粘贴该语句phpMyAdmin,它返回正确的(非空)结果.我不知道这些陈述是否具体是问题,但可能是一般使用CREATE TEMPORARY TABLE ...或使用多种陈述.
另外我猜驱动程序可能正在尝试为每个sql语句返回一个结果,而VBA只是获取第一个或者其他东西......
编辑:sql语句供将来参考.
CREATE TEMPORARY TABLE tmpOrders AS
SELECT
o.customerName,
SUM(o.Sales) AS Sales,
SUM(TotalFobCost + TotalLandedCost + TotalLocalCost + TotalCmtCost) AS TotalCost,
YEAR(o.deliveryDate) AS YEAR,
MONTH(o.deliveryDate) AS MONTH
FROM devere_costing.orders_fixed_extras AS o
WHERE o.orderApproved = TRUE
AND o.orderCanceled = FALSE
AND o.deliveryDate BETWEEN '2014-01-01' AND '2014-03-31'
GROUP BY customerName, YEAR, MONTH
ORDER BY YEAR …Run Code Online (Sandbox Code Playgroud) 我刚刚发现我可以使用CreateObject方法从VBA创建一些.Net类,它可以创建COM类.这非常酷,但是创建的类是后期绑定的,所以你没有获得任何intellisense等.所以我希望做的是编写VBA包装类并将所有方法调用委托给.Net对象的内部引用.
因此,除了尝试引用枚举器之外,这适用于所有内容的ArrayList对象.有一个VBA的黑客攻击,它允许您创建自己的集合并使用For Each ...语法来枚举您的集合.以下是一个例子:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = <<< pass a reference to the enumerator here.
End Property
Run Code Online (Sandbox Code Playgroud)
大多数实现都包含对VBA Collection对象的引用,并传递Collection对象的枚举器.但是,由于我持有.Net ArrayList,我想将其传递出去.但是,当我尝试时,我得到"无效的过程调用或参数".
我目前的尝试是这样的:
Public Function NewEnum() As IUnknown
Dim enumerator As Object
Set enumerator = internalList.GetEnumerator() <<<< Error occurs here.
Set NewEnum = enumerator
End Function
Run Code Online (Sandbox Code Playgroud)
我很确定它可以实现这个功能,因为可以在没有包装器的情况下直接迭代ArrayList集合.例如
Public Sub TestCreateArrayList()
Dim list As Object
Set list = CreateObject("System.Collections.ArrayList")
list.Add "an item."
list.Add "another item."
Dim Item As Variant …Run Code Online (Sandbox Code Playgroud)