【发布时间】: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 来修复。
-
这就是为什么我要求您尝试一个非常简单的创建表查询。因为如果这不起作用,那么更复杂的查询也将不起作用。