【问题标题】:ODBC Connection / Crystal ReportsODBC 连接/水晶报表
【发布时间】:2020-04-22 03:28:10
【问题描述】:

我们有一些非常旧的 Crystal 8.5 报告(计划在今年的 Crystal 2016 中重写),昨天已经停止工作。他们使用 Crystal Query (.qry) 文件作为针对 Oracle Database 12c (12.2.0.1.0) 数据库运行的数据源。

当我们在 Crystal 中运行 .rpt 文件时,报告会一直运行,直到出现内存不足问题,尽管它们返回的数据是 gobbledygook 并且页数(数万页)与预期结果无关。

当我们在 Crystal SQL Designer 8.0 中运行 .qry 文件时,我们只得到返回的第一行数据。

在 ODBC 数据源管理器中打开跟踪,日志文件中有几个条目似乎表明存在潜在问题:

test            f3b4-f974   ENTER SQLSetConnectAttr 
    SQLHDBC             0x023ECB78
    SQLINTEGER                1041 <unknown>
    SQLPOINTER          [Unknown attribute 1041]
    SQLINTEGER                  -3 

test            f3b4-f974   EXIT  SQLSetConnectAttr  with return code -1 (SQL_ERROR)
    SQLHDBC             0x023ECB78
    SQLINTEGER                1041 <unknown>
    SQLPOINTER          [Unknown attribute 1041]
    SQLINTEGER                  -3 

    DIAG [S1C00] [Oracle][ODBC]Driver not capable. (0) 

test            f3b4-f974   ENTER SQLSetConnectAttr 
    SQLHDBC             0x023ECB78
    SQLINTEGER                1042 <unknown>
    SQLPOINTER          [Unknown attribute 1042]
    SQLINTEGER                  -3 

test            f3b4-f974   EXIT  SQLSetConnectAttr  with return code -1 (SQL_ERROR)
    SQLHDBC             0x023ECB78
    SQLINTEGER                1042 <unknown>
    SQLPOINTER          [Unknown attribute 1042]
    SQLINTEGER                  -3 

    DIAG [S1C00] [Oracle][ODBC]Driver not capable. (0) 

如果我们使用第三方查看器,我们可以生成大部分报告。如果我们运行不使用.qry 文件的报告,我们不会有任何问题。

有没有人遇到过类似的问题?或者有没有人对我们不知道由于任何补丁等而可能发生的变化有任何指示?

【问题讨论】:

    标签: sql oracle crystal-reports odbc crystal-reports-8.5


    【解决方案1】:

    我们在使用 qry 的 Crystal Reports 8.5 中遇到了同样的问题。 这是我隔离这个问题的过程,希望其他人可以对这个问题有更多的了解。

    我可以使用 CR Designer 生成相同的错误,如果将计算机日期设置回 2019 年,它可以正常工作。产生的错误是

    "xBase error: Last file change date in error".

    通过设计器,我能够将涉及的 dll 可执行文件缩小为:P2bxbse.dll(文件版本 8.6.0.25)、P2sodbc.dll(fv 8.6.1.86)和P2lodbc.dll(fv 8.6.0.31)。从观察故障点来看,这些 dll 之一(我怀疑 P2lodbc.dll)在执行 qry 时,将底层数据库中的元数据读取到临时文件中,该文件原来是 .dbf 类型的(dBase 数据库文件- 在\user\localdata 目录中)。这可以解释为什么该错误与 ODBC 驱动程序或底层数据库无关。该文件会快速创建并锁定,直到 qry 终止,因此难以分析。

    .dbf 文件的文件格式文档显示,除其他外,最后一次文件更改的日期有 3 个字节(参考 http://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm)。我怀疑问题出在这里,因为互联网上有几种解释如何解释这些数据以及如何应对 2020 年,但都没有说服力!

    编辑,对不起,我刚刚注册了一个帐户在这里发帖,系统不允许我评论:((只有 1 个声望)所以我希望你也可以在这里输入我的意见。

    我有一个非常旧的程序在打印 .rpt 时出现此问题,因为我没有该程序的源代码,所以我无法在此处进行任何建议的更改,幸运的是我不必打印很多,所以当我需要打印时,我现在使用 HEX 编辑器 (HxD) 并编辑所涉及的 .dbf (xbase) 数据库文件的位 1,2 和 3。如果我将其更改为 77 0C 1F(这是 2019 年 12 月 31 日的代码)并保存 .dbf 文件,只要我不编辑任何数据库数据,打印我的报告就没有问题。 (程序中的实际日期可能是 2020 年,这无关紧要)如果有人可以编辑旧的水晶报告 DLL 文件以简单地忽略数据库中的文件编辑日期,则永久修复将是:(

    有谁知道我可以用来批处理文件的 HEX 编辑器吗? :)

    【讨论】:

    • 嗨,格雷厄姆,感谢您分享您的发现。您在哪里看到“xBase 错误:上次文件更改日期错误” - 在 CR Designer 中我们没有看到任何错误,但只返回 1 行。鉴于您和 Meg 都能够通过将时钟日期更改为 2019 来使 .qry 文件正常工作(由于系统策略,我无法对此进行测试)这似乎是问题所在,尽管 db7 文件格式表明它可以处理到 2155 年的日期吗?谢谢
    • 嗨 Salmoni,使用稍旧版本的 P2lodbc.dll(fv 8.5.0.19) 我得到相同的一行返回,没有错误。如果您使用 CR8.5 sp3 中的 dll ,那么您将在 CR 设计器中得到“xBase 错误”,所以我们都有同样的问题。. db7 文档确实说它应该能够处理到 2155 的日期,但我'不确定它是不是一个 db7 文件可能要旧得多。
    【解决方案2】:

    我们遇到了完全相同的问题,尽管是 SQL Server 2016。但是,我们甚至无法运行 .qry 文件。

    如果我们将计算机日期更改为 2019 年的 1,我们就可以运行 .qry 文件。

    【讨论】:

    • 它昨天停止工作 - 我不在办公室,今天早上发现了。
    【解决方案3】:

    症状还包括:

    xbase 错误:上次文件更改日期出错

    错误:自动化错误

    调用的对象已与其客户端断开连接。

    我们在使用 Crystal Report 7 / 8.5 时遇到了这个问题

    报表使用查询作为数据源时提示日期错误。

    系统时间临时更改为2019后正常工作。

    【讨论】:

      【解决方案4】:

      解决此“2020 Crystal Report 错误”的方法是删除 .qry 中间文件

      • 在您的数据库上创建一个数据库 *-view 来代替您在 .qry 中的查询,
      • 使用 Crystal Reports“工具”创建一个新的 .rpt 文件。

      但这需要您重新编写报告。更好地直接迁移到更新的报告工具。

      【讨论】:

        【解决方案5】:

        除了this answer,下面是我们过去继续使用旧报告的解决方案:将CR8.5替换为CR11.5

        注意:报告是从vb6开发的应用程序启动的,我必须维护它。

        • 必须安装 Crystal Reports 11,这意味着我们必须购买新的许可证。
        • 然后用新的替换旧的 vb6 CR8.5 组件非常简单。

          提供了很多帮助
          • some old CR8 migration document - 我们必须按照步骤从 OCX 迁移到 报表设计器组件 (RDC) - 包括 Crystal Report 8 ActiveX 设计器运行时库 (CRAXDRT),
          • 然后extended documentation on how to use this CRAXDRT 帮了大忙(但似乎是针对早期版本的,并没有解决所有问题),
          • 当时我们需要在报告中设置一个变量,我不得不使用魔法found here

            Private Sub setIdContext(v As String)
                Dim myParamFields As CRAXDRT.ParameterFieldDefinitions
                Dim myParamField As CRAXDRT.ParameterFieldDefinition
                Set myParamFields = CrxRep.ParameterFields
                For Each myParamField In myParamFields
                    With myParamField
                        Select Case .ParameterFieldName
                            Case "ID_Context"
                                .SetCurrentValue Val(v)
                        End Select
                    End With
                Next
            End Sub
            

        限制: ...仍在寻找如何在客户端上部署 VB6 exe 而无需部署完整的 Crystal Report BOXI 的方法:(

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-01
          • 2013-11-08
          相关资源
          最近更新 更多