我正在编写一个工具,它从本地系统中获取数据,然后将数据发送到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 - 它有效 - 所以我的问题已经解决了,但是如果有人能解决这个问题,请分享。
答案 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'")
..
.