【问题标题】:Characters found after end of SQL statement VBA code Access 2007SQL语句VBA代码Access 2007结束后发现的字符
【发布时间】:2009-12-11 19:14:23
【问题描述】:

我正在用 Excel 编写 VBA 代码来访问 Access 数据库。

我正在使用此提供程序

"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";"

这是我的 SQL 字符串

SQlSrc = "SELECT YEAR FROM Data ORDER BY YEAR ASC"
SQlSrc = SQlSrc & ";SELECT STN FROM STN_List WHERE include = TRUE"

当我单独打开每个记录集时,它可以工作(只是第一行或第二行)但是当我像上面那样作为单个语句进行时,我得到一个错误

"SQL 语句结束后找到的字符"

有人知道这是否是 Access 2007 的问题吗?

【问题讨论】:

  • 听起来像是通过只允许执行一条语句来阻止 SQL 注入攻击。
  • Jet/ACE 从来没有处理过多个 SQL 语句并且永远不会,不是为了避免 SQL 注入(Jet/ACE 容易受到攻击的 SQL 注入类型仍然很多),而是因为没有服务器- 用于序列化 SQL 语句和交错来自多个用户的请求的端进程。
  • @David W. Fenton:“因为没有服务器端进程来序列化 SQL 语句和交错来自多个用户的请求”——为什么你认为它需要一个。您可以执行此客户端,例如使用带有批处理乐观锁定的 ADODB 记录集,进行更改然后 UpdateBatch。至少 Jet 4.0 已支持此功能。为什么你认为这个模型不应该起作用?

标签: sql ms-access


【解决方案1】:

您可以重复使用该连接。

Dim cn As Object
Dim rs As Object

cn="Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";"

SQlSrc = "SELECT YEAR FROM Data ORDER BY YEAR ASC"
rs.Open SQlSrc, cn

''Do stuff

SQlSrc = "SELECT STN FROM STN_List WHERE include = TRUE"
rs.Open SQlSrc, cn

cn.Execute "UPDATE Table SET Column=2"

【讨论】:

  • 嗯,不完全是。您示例中的第二个调用是将第二个 SQL 查询附加到第一个查询,使我们回到开始的位置。它应该只是一个直接的分配,并且丢失分号。
【解决方案2】:

看起来 Access 和/或提供程序不接受用于打开单个记录集的多个 SQL 语句。

也就是说,我不确定这是否是所有 OLEDB 提供商的标准,还是仅适用于您正在使用的提供商。

【讨论】:

  • Access 从来不支持多个语句
【解决方案3】:

IMO MS Access 不支持在单个命令中使用多个 SELECT 语句。您可能必须将其拆分为单独的命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2017-09-02
    相关资源
    最近更新 更多