【问题标题】:Access 2007 to Oracle 10g linked table -- query with flawed results, but no errors thrownAccess 2007 to Oracle 10g 链接表——查询结果有缺陷,但没有抛出错误
【发布时间】:2011-03-21 17:42:30
【问题描述】:

在使用 WHERE 子句过滤掉不需要的记录时,查询链接的 oracle 10g 表的 Access 2007 数据库返回有缺陷的结果集。奇怪的是,一些过滤正在发生,但并不可靠。

我可以可靠地演示/产生这样的问题:

  1. 使用 Access 2007 创建一个 *new* 数据库。
  2. 使用 Access 2007 创建第二个 *new* 数据库,然后“另存为”2000。
  3. 使用旧版本的 Access 创建第三个 *new* 数据库。
  4. 在每个数据库中运行以下查询:
SELECT 
    STATUS, 
    ID, 
    LAST_NAME, 
    FIRST_NAME
FROM 
    Oracle10g_table
WHERE 
        STATUS="A" 
  • 在使用 Access 2007 创建的两个数据库中,运行此查询将为您提供一个结果集,其中 一些 的 (STATUS="A") = false 记录已被过滤掉,但没有全部。
  • 在使用旧版本 access 创建的数据库中,where 子句过滤正确,结果集正确。
  • STATUS 是一个文本字段
  • 该表是到 Oracle10g 数据库的“链接”表
  • 该表有 68k 行
  • 我已经在 60、1000 和 0 测试了超时

有人遇到过这个问题吗?

我想知道这是否是一个新的访问“功能”,也会影响 2010 年。这与 ODBC 有什么关系吗?

感谢您的帮助, - 戴夫

更多...

我刚刚尝试了另一种查询形式,使用 HAVING 而不是 WHERE,它成功了!问题是,除了这不应该改变任何东西(是的——更多的虚拟表,但不应该改变最终结果)我的最终用户将使用 Access 2007 可视化查询设计器,而不是直接输入 SQL,这将将他们输入到 WHERE 中的任何条件默认为默认值。

【问题讨论】:

    标签: sql ms-access oracle10g odbc ms-access-2007


    【解决方案1】:

    我的直觉是,Access 用于连接到 Oracle 的 ODBC 驱动程序之一将“A”视为列名,而不是文字“A”。您是否尝试过在“A”上使用单引号?在Oracle中双引号用于引用列名,是否有一个名为“A”的列?

    Oracle 查询示例 #1

    Select object_name from all_objects
    where "OBJECT_NAME" = 'DUAL'
    

    Oracle 查询示例 #2

    with example as (
    Select object_name as "Fancy Column Name" from all_objects
    )
    select * from example
    where "Fancy Column Name" = 'DUAL'
    

    【讨论】:

    • 谢谢布赖恩。实际上,由于 ODBC 在 Access 和 Oracle 之间进行转换,所以这不是问题。无论如何,我检查了它,因为我正处于“我会尝试任何事情”的故障排除阶段:-),但是,是的,不快乐。
    【解决方案2】:

    我也遇到过类似的问题。就我而言,更改 ODBC 驱动程序是可行的,但我也可以将“唯一记录标识符”更改为其中没有空值的列。它仍然不必是“正确的”唯一记录标识符。

    【讨论】:

    • 这似乎行得通。我认为这有点骇人听闻——它没有解释为什么 2003 年和 2007 年的行为不同。但在我们的技术支持人员弄清楚 ODBC 之前,我可以使用它。谢谢!
    【解决方案3】:

    结果证明这是一个与 ODBC 相关的问题。我们的技术支持服务部​​门在我们的每个工作站上安装连接——他们自己编程,谁知道他们实际投入了什么——但最终结果是,当您使用 Access(任何版本)链接到 ODBC 数据源时,我们的网络服务器显示在“机器数据源”选项卡中,因此我们只需单击所需的服务器即可。这在 Access 2007 之前一直运行良好。

    我所做的是创建一个“新”机器数据源,让我自己选择 ODBC 驱动程序(而不是让我使用我们的技术支持人员创建的那个)。我选择了“Microsoft ODBC for Oracle”,输入了我想要的服务器的名称,然后就完成了。现在 WHERE 子句不一致的过滤问题得到了解决(我希望如此)。

    剩下的唯一事情就是将其发回给我们的技术支持人员,以便他们清理安装。我应该要求危险津贴吗? :-) 呵呵

    【讨论】:

    • 实际上,我们有很好的技术支持。我觉得时不时地给他们大笑是我的庄严职责。但老实说,就我的理解能力而言,他们为我们所做的仍然是“魔法”;他们努力工作——必须给他们那个。由于我们所处的糟糕的经济/预算危机,他们因裁员而失去了这么多职位,这对任何人都没有帮助。
    • 两件事:您应该考虑无 DSN 连接 (accessmvp.com/djsteele/DSNLessLinks.html),并且任何时候您从 ODBC 链接表中得到不可靠的结果,删除链接表并重新创建它。 ODBC 链接表缓存几乎永远不会正确刷新的元数据,因此您必须创建一个全新的链接表。
    • 有趣的是,旧 ODBC 连接的问题与 Access 在链接到表时询问您要将哪个字段标识为主键字段有关。当然,没有典型的最终用户有任何方法知道选择什么(列表中有 100 个表,没有关键字段的指示)。在 2003 年,选择并不重要。但是在 2007 年,如果您选择一个包含空值的字段,那是 WHERE 子句开始出现故障的时候。因此,有两种方法可以克服:1)将 odbc 更改为 Microsoft 的 ODBC for Oracle 选项,或者选择一个没有空值的 pk 字段。
    • 这正是删除和重新创建链接表更正的事情。
    • 是的——我明白了,这对很多问题都很有效——但在这种情况下,由于 Access 2007 对用户选择的列中的空值存在问题,因此重新链接没有帮助。如果我们重新链接到一个更好的领域,问题会(似乎)消失,但这有点让我们不太自信,因为真正的问题是 ODBC 驱动程序本身无法相处使用 Access 2007 或更高版本(我们验证这也是 2010 的问题)。无 DSN 连接也是一个好主意,但不幸的是,这对我的用户来说不是一个选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2018-08-16
    相关资源
    最近更新 更多