【问题标题】:VBA MySQL Several queries in one ExecuteVBA MySQL 一次执行多个查询
【发布时间】:2017-07-09 10:43:18
【问题描述】:

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

我决定迁移到 MySQL,连接也可以执行单个查询。 但是以这种方式这样做在时间上是不可接受的(对于我的数据批处理 - 将数据添加到 accdb 需要 1.5 秒,将数据添加到 MySQL 需要将近 80 秒)。

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

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

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

我读到 ADODB 连接(我使用的)不能执行多个查询 - 但如果有其他选择吗?

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

我的连接已声明

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,这里是完整的代码 sn-p:

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,2017 年 7 月 10 日

我决定运行 multiple row INSERT - 它有效 - 所以我的问题得到了解决,但如果有人对此主题有任何解决方案,请分享。

【问题讨论】:

  • 您能给我们看一个产生语法错误的代码示例吗?
  • @joanolo 我编辑了第一篇文章。
  • 这行得通吗? CREATE TABLE abc ( a CHAR , b char );CREATE TABLE xyz ( a CHAR , b char );
  • @jsotola - 我认为这是特定于 ADODB 连接的问题,这些类型的查询不能一次执行。此错误只能通过更改 vba 代码而不是 SQL 来修复。
  • 这就是为什么我要求您尝试一个非常简单的创建表查询。因为如果这不起作用,那么更复杂的查询也将不起作用。

标签: mysql vba ado adodb


【解决方案1】:

@Krukosz - 我今天有同样的问题,我用另一种方式解决了它。好吧,您可以在 ForEach-order 其他循环中执行每个命令,由“虚拟”Dash-Comma ';' 分隔/拆分您在不是在 VBA 中的“普通”SQL 语句中使用。您可以在更多 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'")
..
.

【讨论】:

    最近更新 更多