因此,MSAccess 2010使用MySql后端,通过ADODB.connection进行连接,语句的形式如下:
...
Set cnx = Application.CurrentProject.connection
On Error GoTo ERROR_HANDLER
If Not TableExistsADO(cnx, "fixedsampleresults") Then
createSpec = "CREATE TABLE `" & dbName & "`.`fixedsampleresults` ( " _
& "`ID` INT(11) NOT NULL, " _
& "`AreaID` INT(11) NULL, " _
& "`RegionID` INT(11) NULL, " _
& "`TopRating` INT(11) NOT NULL, " _
& "`TotalRespondants` INT(11) NOT NULL, " _
& "`Percentage` DECIMAL(5,3) NOT NULL, " _
& "PRIMARY KEY (`ID`), " _
& "UNIQUE INDEX `id_UNIQUE` (`ID` ASC));"
cnx.Execute createSpec
...
end if
...
它正在到达Execute行并失败,返回错误消息:"运行时错误-2147217900(80040e14)Create Table语句中的语法错误"。
我使用immediate窗口和debug.print精确复制createSpec,并在MySql Workbench的查询选项卡上输入并运行它,没有问题。
DataDefinition语句在针对MySql的Execute中是否合法,或者这是Access synatrx要求的差异,还是其他原因?
在Access应用程序中,CurrentProject.Connection
是使用Jet/ACE OLEDB与Access数据库的ADO连接。因此,如果对该连接执行CREATE TABLE语句,它将被解释为Access SQL,并将尝试在当前数据库中创建本地Access表。
如果你想创建一个MySQL表,那么你需要使用一个传递查询,比如:
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("anExistingLinkedTableInAccess").Connect
qdf.SQL = "CREATE TABLE IF NOT EXISTS `" & dbName & "`.`fixedsampleresults` ( " _
& "`ID` INT(11) NOT NULL, " _
& "`AreaID` INT(11) NULL, " _
& "`RegionID` INT(11) NULL, " _
& "`TopRating` INT(11) NOT NULL, " _
& "`TotalRespondants` INT(11) NOT NULL, " _
& "`Percentage` DECIMAL(5,3) NOT NULL, " _
& "PRIMARY KEY (`ID`), " _
& "UNIQUE INDEX `id_UNIQUE` (`ID` ASC));"
qdf.ReturnsRecords = False
qdf.Execute
Set qdf = Nothing