- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 TADOQuery
组件时遇到了一个奇怪的问题。
我目前工作的地方使用在 Windows XP VM 上运行的 Borland C++Builder 应用程序。因此,我们希望迁移到 Windows 7 并将其用作终端,以便员工可以接收装有 Windows 10 的新机器,而无需在每台机器上再次创建 Win XP VM。
目前该应用程序使用 BDE 组件,并且在 XP 上运行良好。我们创建了一个 Win7 64 位虚拟机用于测试,并安装了必要的驱动程序等,但 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 不会用 0 替换每次出现的“BEN”,我最终得到一个包含 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 组件时,我展开“今日检查”节点,但代码运行、加载参数、激活查询组件,但我没有得到任何结果!所以节点保持折叠状态。如果我再次单击 +
符号伸展树(Splay Tree),它会加载支票!之后每次都会加载它们。
因此,在应用程序中有一个日期选项,默认为今天的日期。如果我将其更改为昨天的日期,我仍然会收到今天的支票……就像参数没有得到更新一样。如果我一开始就尝试从不同的日期开始,我不会得到任何结果!它将带来今天日期的结果,但之后它不会接受不同的日期。
我调试了代码,日期发生了变化,但出于某种原因,参数没有发生变化。这是我的代码块:
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 的用户界面,但仍在构建中。在那之前,我需要进行必要的更改/更新,这是我工作的一部分。
最佳答案
好的,我让它工作了!!
对于在 Windows 7 64 位上使用 BDE 苦苦挣扎的任何人,这里有一个解决方案!请记住,我正在处理的数据库是使用 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 组件,但不再需要了。
关于c++ - C++ Builder 6 和 Windows 7 64 位上的 ADOQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35898736/
我不确定为什么会发生这种情况,所以我将简要解释一下情况(应该很容易理解): Form1 一个执行 sql select 语句并将其显示在通过 TDataSource 组件链接到 ADOQuery1 组
我想请您帮助我的 Delphi 项目(RAD Studio),我是 Delphi 的新手。 我正在使用:TADOConnection(带连接字符串)2x ADOQUERY(设置“连接 = TADOCo
我在 Delphi 2010 应用程序中使用异步 ADO 查询。用户可以请求取消查询,否则查询可能会因错误而失败。这是我用来取消查询的代码: if not Assigned(myADOQuery.Re
尊敬的专家们,我正在尝试过滤连接到 adoquery 的 dbgrid 中的结果,根据用户对 4 个复选框的选择,用户可以选择一个或多个字段来相应地过滤数据我有这段代码,如果用户选择两个或多个复选框,
我想将 ClientDataSet 保存到文件,然后在 AdoQuery (AdoQuery.LoadFromFile()) 中打开该文件。可能吗? 或者如何将数据集保存为 pfADTG 文件格式?
我有一个ADOQuery,它将记录插入到SQL Server 2005表中,该记录已触发将数据插入到另一个表中。我使用以下代码刷新查询并避免使用Row cannot be located for up
我在这里使用的是 Delphi 5 和 SQL Server 2000。 我使用 INSTEAD OF DELETE 触发器在可更新 View 之上创建了一个 ADOQuery。 可更新 View 主
我在快速报告中遇到问题,显示 ADO 查询中的数据不正确。我使用以下 sql.text SELECT * FROM JOB_DATA INNER JOIN CUSTOMER ON JOB_DATA.C
我有这个简单的代码来检查表中是否存在记录,但它总是返回运行时错误: Arguments are of the wrong type, are out of acceptable range, or a
我正在努力寻找执行 SQL 查询的正确过程。 基本上,我有一个文本字段,用户可以在其中输入 SQL 代码,程序将执行它。不幸的是,我不知道是否会返回数据集,因此我无法判断使用哪个函数:ADOQuery
我在 Delphi 7 和 Oracle 中使用 ADOQuery。我在将参数传递给 ADOQuery 时遇到错误。我用过以下行。请帮我找出错误。 ADOQuery.Sql.text:= 'selec
我有这个返回访问冲突的代码('sqloledb.dll' 模块中地址 74417E44 的访问冲突。读取地址 786E3552'),我无法确定问题出在哪里。我唯一的猜测是 ADOQuery 对我们可以
我正在测试一些数据库组件,例如 SDAC 等,我发现了一些有趣的东西: 当我使用 TADOQuery 执行查询并且该查询有很多 blob 字段并且我获取所有行 (fetchall) 时,我的应用程序的
我正在使用 ADO 组件连接到 MS SQL 数据库。我知道如何在 DBGrid 中显示查询结果。但是,例如,我想将结果作为字符串存储在数组中。 这是否可能,或者是否有其他方式使用查询结果? 最佳答案
好的,我有一个查询应该返回所有问题编号。我想要的是获取返回的每个问题编号并将其添加到字符串列表中。 ADOQuery1.SQL.Clear; SQLQuery := 'SELECT issue FRO
我有一个通过数据源链接到 DBGrid 的 ADOQuery。 ADOQuery 和DataSource 位于DataModule 中,并且连接采用另一种形式。 有什么方法可以让我的应用程序在查询获取
我在 ADOQuery2 中有一个查询。现在我想要一个过滤器: ADOQuery2.Filter := 'where Fname like ' + QuotedStr(Txt_Search.Tex
我正在撕扯我的头发!! 即使是像这样简单的事情: procedure MyAdoQueryTest(); const MYSQL_CONNECT_STRING='Driver={MySQL OD
我有一个 Delphi 7 项目,它使用 MySQL 中的数据库来存储一些配置。每当我更改配置时,都会启用“保存”按钮。此按钮中的 OnClick 过程调用 TADOQuery.Edit、Select
我有以下行来定位查询中的一行。 if Query.Locate('Line;Hour;Minute',VarArrayOf([Line-400,AHour,minuteof(Start)]),[])
我是一名优秀的程序员,十分优秀!