【问题标题】:ADOQuery on C++ Builder 6 and Windows 7 64bitC++ Builder 6 和 Windows 7 64 位上的 ADOQuery
【发布时间】:2016-03-09 17:38:46
【问题描述】:

我在使用 TADOQuery 组件时遇到了一个奇怪的问题。

我目前在他们使用在 Windows XP VM 上运行的 Borland C++Builder 应用程序的地方工作。所以我们想迁移到 Windows 7 并将其用作终端,这样员工就可以接收装有 Windows 10 的新机器,而无需在每台机器上再次创建 Win XP VM。

目前该应用程序使用 BDE 组件,并且在 XP 上运行良好。我们创建了一个 Win7 64 位 VM 进行测试,并安装了必要的驱动程序等,但 BDE 无法正常工作。当我尝试通过 Borland 附带的 SQL Explorer 登录时,它只是挂起。它发送请求但从未得到响应。我花了一个多星期的时间试图调试这个问题,但没有得到任何解决。

不管怎样,我放弃了BDE,想尝试改用ADO。因此,我首先创建了一个TDBGrid,并使用 ADO 组件填充数据。它在 XP 和 Win7 上都运行良好!所以现在我正在尝试将应用程序的 BDE 组件(TDataBase、TQuery 等)转换为 ADO 组件。

我在尝试使用参数时遇到了一个有趣的问题。这是一个查询示例:

SELECT t1.SEC_CODE, t1.CODE, t1.CTRL_NUM, t1.CHECK_CODE,
t1.CHECK_NO, t1.CLIENT_ID, t1.AMOUNT, t1.TRANS_NO, decode(t2.prefix,null,t2.name,t2.name||', '||t2.prefix) as fullName,
t1.ENTRY_DATE, t1.DEPOSIT_DATE, t1.ACCT_COMMENT, t2.NAME, t2.PREFIX
FROM ACCOUNTING.ACCT_CHECK_IN t1, OISC.CLIENT t2
WHERE
(:BEN =1 OR (:BEN =0 AND t1.ENTRY_DATE=:DATE)
OR (:BEN =2 AND t1.DEPOSIT_DATE IS NOT NULL)
OR (:BEN =3 AND t1.DEPOSIT_DATE IS NULL)) AND
(:ALEX =1 OR (:ALEX =0 AND t1.ENTRY_DATE>=:DATE1 AND
t1.ENTRY_DATE<=:DATE2) OR (:ALEX =2 AND t1.DEPOSIT_DATE>=:DATE1
AND t1.DEPOSIT_DATE<=:DATE2))
AND T2.CLIENT_ID(+)=T1.CLIENT_ID 

ORDER BY t1.SEC_CODE, t1.CHECK_CODE, fullName, t1.check_no

请不要注意参数名称,这对我来说有点可笑但你们将无法连接。

这里的第一个问题是,即使某些参数名称相同,ADO 仍将它们视为单独的参数!所以,如果我这样做:

checkload1->Parameters->ParamByName("BEN")->Value=0

ADO 不会将每次出现的“BEN”都替换为 0,我最终会得到 0 条记录的结果集!相反,我正在使用这个:

checkload1->Parameters->Items[0]->Value = 0; // BEN param
checkload1->Parameters->Items[1]->Value = 0;
checkload1->Parameters->Items[3]->Value = 0;
checkload1->Parameters->Items[4]->Value = 0;

基本上,根据参数索引将每个“BEN”参数替换为 0。

这会给我带来结果,但不是马上。

它是这样工作的:应用程序是一个基于树的用户界面。有一个节点显示“今天的支票”,它在展开时显示今天的支票。太好了,现在这对 BDE 非常有效,我只分配一次参数值,它会自动替换它看到“BEN”等的任何地方。

当使用 ADO 组件时,我展开“Today's Checks”节点并且代码运行,加载参数,激活查询组件,但我没有得到任何结果!所以节点保持折叠状态。如果我再次单击+ 符号以展开树,它会加载检查!之后每次都会加载它们。

因此,在应用程序中有一个默认为今天日期的日期选项。如果我将其更改为昨天的日期,我仍然会得到今天的支票......就像参数没有更新一样。如果我一开始就尝试从不同的日期开始,我不会得到任何结果!它会带来今天日期的结果,但之后它不会接受不同的日期。

我调试了代码并且日期正在改变,但由于某种原因参数没有改变。这是我的代码块:

checkload1->Filter="" ;
checkload1->Filtered=false ;
switch(params)
    {
    case 0: checkload1->Parameters->Items[0]->Value = 1; // BEN param
            checkload1->Parameters->Items[1]->Value = 1;
            checkload1->Parameters->Items[3]->Value = 1;
            checkload1->Parameters->Items[4]->Value = 1;
            // ALEX Param
            checkload1->Parameters->Items[5]->Value = 0;
            checkload1->Parameters->Items[6]->Value = 0;
            checkload1->Parameters->Items[9]->Value = 0;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS NOT IN ('Refunded', 'Posted') ";
            break ;
    case 1: checkload1->Parameters->Items[0]->Value = 0; // BEN param
            checkload1->Parameters->Items[1]->Value = 0;
            checkload1->Parameters->Items[3]->Value = 0;
            checkload1->Parameters->Items[4]->Value = 0;
            checkload1->Parameters->ParamByName("DATE")->Value=FormatDateTime("dd-mmm-yyyy", Date()) ;
            checkload1->SQL->Strings[13] = " ";
            break ;
    case 2: checkload1->Parameters->Items[0]->Value = 2; // BEN param
            checkload1->Parameters->Items[1]->Value = 2;
            checkload1->Parameters->Items[3]->Value = 2;
            checkload1->Parameters->Items[4]->Value = 2;
            //ALEX param
            checkload1->Parameters->Items[5]->Value = 2;
            checkload1->Parameters->Items[6]->Value = 2;
            checkload1->Parameters->Items[9]->Value = 2;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Deposited') ";
            break ;
    case 3: checkload1->Parameters->Items[0]->Value = 3; // BEN param
            checkload1->Parameters->Items[1]->Value = 3;
            checkload1->Parameters->Items[3]->Value = 3;
            checkload1->Parameters->Items[4]->Value = 3;
            //ALEX param
            checkload1->Parameters->Items[5]->Value = 0;
            checkload1->Parameters->Items[6]->Value = 0;
            checkload1->Parameters->Items[9]->Value = 0;
            checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Held') ";
            break ;
    }
if(!mainform->date1->Checked){
checkload1->Parameters->Items[5]->Value = 1;
checkload1->Parameters->Items[6]->Value = 1;
checkload1->Parameters->Items[9]->Value = 1;
}
checkload1->Parameters->Items[7]->Value = FormatDateTime("dd-mmm-yyyy", fromdate);
checkload1->Parameters->Items[10]->Value = FormatDateTime("dd-mmm-yyyy", fromdate);
checkload1->Parameters->Items[8]->Value = FormatDateTime("dd-mmm-yyyy", todate);
checkload1->Parameters->Items[11]->Value = FormatDateTime("dd-mmm-yyyy", todate);

if(filters != "") checkload1->SQL->Strings[12] = filters;
else checkload1->SQL->Strings[12]=" " ;
checkload1->Prepared = true;
checkload1->Active=true ;

有经验的人可以给我建议吗?

我知道这是古老的东西,但这些程序实际上是在 15 到 20 年前编写的,它们正在转向基于 Web 的用户界面,但仍在构建中。在此之前,我需要将所需的更改/更新作为我工作的一部分。

【问题讨论】:

    标签: c++ c++builder ado bde c++builder-6


    【解决方案1】:

    好的,我得到了这个工作!

    对于那些在 BDE 上苦苦挣扎以在 Windows 7 64 位上工作的人来说,这里有一个解决方案!请记住,我正在处理的数据库是使用 C++ Builder 6 构建的 Oracle 8i 和 Borland C++ 应用程序。

    按照照片和箭头。我试图在每张照片上加上自己的评论,但后来这个网站说我不能发布超过 2 个链接......他们见鬼去吧,所以我把所有的都放在一张照片上。

    例如,这个 TQuery 正在寻找 bnetdata 作为数据库。太好了,在下图中我们添加了一个 ADOConnection 组件

    单击突出显示的连接字符串。

    选择使用连接字符串并点击构建。

    选择突出显示的提供程序,然后单击下一步。

    勾选使用数据源名称,然后单击箭头选择一个。请注意,您稍后将输入用户名和密码并检查允许保存密码。

    选择 BDE 组件正在使用的同一数据源。请注意,这是 ODBC 管理器中系统 DSN 下的来源之一。如果不存在,则创建一个。

    这是来自 ODBC 管理员的截图。请注意,这仍然是 XP 环境。您需要在 windows 7 机器上创建相同的数据源(在我的例子中为 bnetdata)。

    现在点击高级并从列表中检查读写选项。

    在 ADOConnection 组件上单击“确定”后,正如您现在在对象检查器中看到的那样。查看突出显示的区域。现在,我们需要将 connected 属性设置为 true。当你这样做时,它会要求你登录到数据库。输入用户名和密码,然后单击“确定”。连接属性现在将变为真。之后,您需要将 LoginPrompt 属性设置为 false。现在点击项目的保存。

    假设你也有 BDE 数据库组件,点击它然后清除别名和驱动程序名称,然后将你的数据库名称放在 databaseName 属性下(在我的例子中是 bnetdata)。

    保存项目并在 XP 中编译。复制应用程序并将其粘贴到 Windows 7 机器中并双击它,它会工作!我已经成功地将所有应用程序转换为在 Windows 7 上运行。最困难的部分是安装 Borland 并让 Windows 7 在 ODBC 管理器的驱动程序选项卡下识别 Oracle ODBC 驱动程序。

    同样,Borland 安装附带的 SQL Explorer 无法正常工作。所以,我仍然需要在我的 Windows XP VM 中进行开发,但用户可以在 Windows 7 VM 中使用该应用程序作为 Windows 服务器上的终端......对我有用!!

    希望这对某人有所帮助!

    编辑:

    我还在 ADOConnection 中尝试了 Microsoft OLE DB Provider for Oracle,它也有效。没有看到对速度或性能的可衡量影响。两者似乎都以相同的方式执行。我只是对添加 ADOConnection 组件如何让应用程序连接到数据库并像在 XP 中一样工作感到惊讶!

    也只是为了搞清楚,您不需要更改应用程序中的 BDE 组件。只需要添加 ADOConnection 并且所有其他组件保持不变(BDE 组件)。我试图转换为使用 ADO 组件,但不再需要了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2015-02-28
      相关资源
      最近更新 更多