【问题标题】:ADO restricted table nameADO 限制表名
【发布时间】:2020-09-30 17:42:54
【问题描述】:

我必须连接到一个名为“DATABASE”的表,这似乎是不允许的。有没有不改变表名的解决方法?

 Set con = New ADODB.Connection
    con.CursorLocation = adUseClient
    RawData = IIf(SelectedRawDromXL <> "", SelectedRawDromXL, SelectedRawFile1)
    con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & RawData & ";Jet OLEDB:Database Password="
    Set objRecordsetraw = New ADODB.Recordset
    ggg = "DATABASE"
    objRecordsetraw.Open ggg, con, adOpenKeyset, adLockOptimistic

【问题讨论】:

  • ggg 应该是一个有效的 SQL 字符串,如 SELECT * FROM tblName 或表名。 MS Access 数据库文件中存在的查询。您收到的错误信息是什么?在哪一行?
  • 所以,我猜您在objRecordsetraw.Open ggg, con, adOpenKeyset, adLockOptimistic 行收到错误消息。原因是ggg 不包含您的 MS Access 数据库中的表或查询的名称,或者是吗?

标签: vba ms-access ado


【解决方案1】:

如果DATABASE 是一张桌子,我的建议是

ggg = "[DATABASE]"
objRecordsetraw.Open ggg, con, adOpenKeyset, adLockOptimistic

PS 1adLockOptimistic + adCmdTable 在我的环境中不起作用。运行objRecordsetraw.Open ggg, con, adOpenKeyset, adLockOptimistic + adCmdTable 时,我得到 RTE 3001。

PS 2:这可能是问题的原因 List of reserved words in Access 2002 and in later versions of Access

【讨论】:

  • 这也只适用于添加到DATABASE的括号。
  • 我只想说它正在工作,现在我不明白为什么像 Customer 这样的表在没有括号的情况下工作,而 DATABASE 只在括号中工作,因为 DATABASE 是 Access 中的保留名称.
  • 这是因为只定义一个表名是愚蠢的,ADO 只是在它前面加上SELECT * FROM (查看objRecordsetraw.Source)。应该只将表名与adCmdTableDirect 结合使用,它实际上打开了具有不同功能的不同记录集类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多