ADOdb.connection.execute出现问题;“创建表格”;通过Mysql后端的MSAccess
因此,MSAccess 2010使用MySql后端,通过ADODB.connection进行连接,语句的形式如下: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 & "`.
...
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--调用失败。