ADOdb.connection.execute出现问题;“创建表格”;通过Mysql后端的MSAccess

ADOdb.connection.execute出现问题;“创建表格”;通过Mysql后端的MSAccess,mysql,ms-access,adodb,Mysql,Ms Access,Adodb,因此,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 & "`.

因此,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
...
它正在到达执行行并失败,错误消息为:“运行时错误-2147217900(80040e14)Create Table语句中的语法错误”

我使用即时窗口和debug.print精确复制createSpec,并在MySql工作台的查询选项卡上输入并运行它,没有问题


DataDefinition语句对MySql执行是否合法,或者这是Access synatx要求的差异,还是其他原因?

在Access应用程序中,
CurrentProject.Connection
是使用Jet/ACE OLEDB与Access数据库的ADO连接。因此,如果针对该连接执行CREATETABLE语句,它将被解释为Access SQL,并将尝试在当前数据库中创建本地Access表

如果要创建一个MySQL表,则需要使用传递查询,如下所示:

Dim cdb作为DAO.Database
设置cdb=CurrentDb
将qdf设置为DAO.QueryDef
设置qdf=cdb.CreateQueryDef(“”)
qdf.Connect=cdb.TableDefs(“anExistingLinkedTableInAccess”).Connect
qdf.SQL=“创建不存在的表”`&dbName&`.`fixedsampleresults`('_
&'ID`INT(11)不为空,'_
&“`AreaID`INT(11)NULL,”_
&“`RegionID`INT(11)NULL,”_
&“`TopRating`INT(11)不为空,”_
&“`TotalRespondants`INT(11)不为空,”_
&“`Percentage`十进制(5,3)不为空,”_
&“主键(`ID`),”_
&“唯一索引`id_UNIQUE`(`id`ASC));”
qdf.ReturnsRecords=False
执行
设置qdf=无

我认为不需要所有的背面标记。要将
dbname
封装为字符串,请使用撇号
'dbname'
不,我也不这么认为。我最初在没有它们的情况下设置它-将它们放进去只是希望它能解决问题-但这没有任何区别,两种方法都会产生相同的结果。我唯一可以建议的另一件事情是查看
decimal()
函数。我知道
INT()!你说得对,我看了一下,小数点是正确的。如果去掉索引会发生什么?主键不应该自动索引记录吗?是的,您在正确的行上-删除了所有列规范,只保留了create table,它忽略了它链接到MySql的事实,并错误地说它找不到C:\…\cppqclientreplication.mdb,所以我想这也可以通过ADODb完成?我见过一个类似的AdoDb示例-我认为(可能是错误的)在同一个应用程序中混合ADO和DAO不是一个好主意,对吗?在同一个应用程序中使用DAO和ADO的组合应该不会有问题。从中“窃取”Connect属性的链接表应该是指向MySQL数据库中的表的ODBC链接表。实际上,尽管执行再次失败,但运行时错误为3146 ODBC-调用失败。我已将“anExistingLinkedTableInAccess”更改为“tblBranch”,并在代码到达执行行时验证了连接。您可以检查
DBEngine.Errors
集合以获取有关调用失败原因的更多信息。有关详细信息,请参阅。(1103):[MySQL][ODBC 3.51驱动程序][mysqld-5.0.18-nt]表名“fixedsampleresults”(3146)不正确:ODBC--调用失败。