Crystal Reports 未使用 Oracle 驱动程序从某些 Oracle 视图返回数据

Posted

技术标签:

【中文标题】Crystal Reports 未使用 Oracle 驱动程序从某些 Oracle 视图返回数据【英文标题】:Crystal Reports not returning data from some Oracle views using Oracle driver 【发布时间】:2016-05-04 21:52:45 【问题描述】:

我正在使用 Crystal Reports 2013 并安装了 Oracle ODAC 32 和 64 位版本。如果我创建一个新报表并使用“Oracle 服务器”数据源,我可以从我有权访问的任何表中进行选择。但是,我发现我没有从某些(不是全部)视图中检索到数据。

查询在 SQL Plus 或 SQL Developer 中运行良好。查询使用 OLE DB 和 ODBC 等过时的驱动程序在 Crystal Reports 中检索数据。

我找不到有效或无效的视图之间的共同点。我测试过的所有视图都属于同一个模式。它们都涉及属于第三个模式的表——也就是说,我以 USER1 身份登录,从属于 USER2 的视图中查询,该视图从属于 USER2 和 USER3 的表中提取数据。为了在表上创建视图并使该视图可供其他人使用,Oracle 需要 SELECT WITH GRANT OPTION 权限,该权限已到位。同样,查询在其他 SQL 工具中也能正常工作。

更新:我尝试以视图所有者的身份登录,但无法查询它们。我尝试以视图所有者 (user2) 和 Crystal Reports 所有者 (user1) 的身份查询基础表。两个用户都可以查询基础表。视图本身似乎是问题所在。

我正在研究有效的观点和无效的观点之间的区别。当我发现不起作用的视图都使用引用列位置的 ORDER BY 子句(例如:ORDER BY 2、1)时,我很乐观。我尝试重写 ORDER BY 以使用列名。没用。尝试删除 ORDER BY 子句。没用。回到绘图板。

【问题讨论】:

驱动连接成功了吗? 是的,连接工作正常并且大部分时间都可以检索数据,但不会通过 SELECT col1 FROM user2.viewname 之类的查询检索数据。在 SQL Developer 和 SQL Plus 中也可以使用相同的查询。 与哪个用户建立了连接? 连接来自原始问题示例中的 user1。 User3 拥有一张表,将 SELECT WITH GRANT OPTION 授予 user2。 User2 创建视图,将 SELECT 授予 user1。 User1 从 user2.viewname 中选择。 我猜 CR 中可能存在连接问题..,如果可能的话,我建议您获取一份主报告,并在指向 3 个用户的 3 个子报告中检查数据是否正确获取 【参考方案1】:

我发现问题在于 Oracle 视图使用的是 Oracle 特定的非标准 SQL。除了上面提到的ORDER BY 2, 1WHERE clause 中还有一个隐式的日期转换例如

WHERE date_col = '01-JAN-2016'

当我添加TO_DATE 函数时:

WHERE date_col = TO_DATE ('01-JAN-2016', 'dd-MON-yyyy')

Crystal Report 能够查询视图。

【讨论】:

以上是关于Crystal Reports 未使用 Oracle 驱动程序从某些 Oracle 视图返回数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Access 数据库和 Crystal Reports 发布 C# 应用程序

使用Crystal Reports ReportDocument

数据库登录失败:Crystal Reports

解决正确案例Crystal Reports

Crystal Reports中的条件总和?

Crystal Reports - “您要求的报告需要更多信息”