VBA MySQL一个查询中的一个执行

时间:2017-07-09 10:43:18

标签: mysql vba ado adodb

我正在编写一个工具,它从本地系统中获取数据,然后将数据发送到MySQL数据库。现在,它在Access DB上运行,但是从少数本地数据库(它在某些计算机上运行)合并数据非常耗时。

我决定转向MySQL,连接也可以执行单个查询。 但是以这种方式做到这一点并不是时间可接受的(对于我的数据批处理 - 将数据添加到accdb需要1.5秒,将相同的数据添加到MySQL中几乎是80秒)。

我知道远程MySQL数据库永远不会像本地Access数据库那么快(MySQL数据库在共享主机上,这是我的私人项目)。

我跟我的朋友PHP和& MySQL dev和他告诉我,批量运行查询会缩短执行时间(例如,一次执行100次查询而不是100次单次执行)。

我修改了我的脚本,但是如果我尝试执行多个查询,我有语法错误 当我将相同的查询粘贴到phpMyAdmin立即窗口时,它可以工作,所以这不是语法 )。

我读到ADODB Connection(我使用的)无法执行多个查询 - 但是如果有其他选择吗?

我可以编写一个小的控制台.NET应用程序来读取.sql文件然后执行批量查询,但首先我要确定它是否真的必要。

宣布我的连接

Set cn = CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};Server=SERVER;Database=DB_NAME;Uid=DB_USER;Pwd=DB_PWD;Option=3" 

strQuery = "CREATE TABLE Z AS (SELECT * FROM tblOffers WHERE 1=2); CREATE TABLE ZZ AS (SELECT * FROM tblOffers WHERE 1=2);"
cn.Execute (strQuery)

这些查询只是用于测试 - 我不是在我的项目中创建新表,而是在上传数据(如果重复则插入或更新)。

我的单个查询如下所示:

INSERT INTO tblOffers (`TITLE`, `LINK`, `IMG`, `PRICE`, `DATE`, `PLATFORM`, `OFF_ID`, `LOCATION_ID`) 
SELECT * FROM (
SELECT "Zgrywus PC", "https://www","zgrywus-pc-znin.jpg",10,'2017-07-08',"PC","6hZH9","0929865") As Tmp 
ON DUPLICATE KEY 
UPDATE `TITLE` = "Zgrywus PC", 
`LINK` = "https://www", 
`IMG` = "zgrywus-pc-znin.jpg", 
`PRICE` = 10, 
`DATE` = '2017-07-08', 
`PLATFORM` = "PC", 
`OFF_ID` = "6hZH9", 
`LOCATION_ID` = "0929865";

编辑:@joanolo,这是完整的代码片段:

Sub ExportDataToAccess()

    Dim cn As Object
    Dim strQuery As String, strClrQuery As String
    Set cn = CreateObject("ADODB.Connection")

    cn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};Server=SERVER;Database=DB;Uid=UN;Pwd=PWD;Option=3"
    strQuery = "CREATE TABLE Z AS (SELECT * FROM tblOffers WHERE 1=2); CREATE TABLE ZZ AS (SELECT * FROM tblOffers WHERE 1=2);"
    Debug.Print strQuery
    cn.Execute (strQuery)


    cn.Close
    Set cn = Nothing

End Sub

产生的错误是: Screen

EDIT2,10-07-2017

我决定运行multiple row INSERT - 它有效 - 所以我的问题已经解决了,但是如果有人能解决这个问题,请分享。

1 个答案:

答案 0 :(得分:1)

@Krukosz - 我今天遇到了同样的问题,我用另一种方式解决了。那么你可以在 ForEachoder 其他循环中执行每个命令,由“虚拟”短划线逗号分隔/拆分“;”您在“普通”SQL 语句中使用而不是在 VBA 中使用。很酷,你可以在更多的 Execute 上使用 var。

这是一个示例代码,在这个示例的最后@start 将是 1082。但它似乎只记住了几分钟的 vars。如果您等待 5 分钟并再次尝试最后一行,@start 的值将为“Null”。

Set rst = dbc.Execute("SET @start = 898")
Set rst = dbc.Execute("SET @start = @start+184 ")
Set rst = dbc.Execute("SELECT @start,'test'")
..
.