2

概述:
我编写了一个应用程序,允许用户定义查询、将其提交到服务器并查看结果。该软件可以在 DB2 或 MySQL 上运行。

问题:
我们在 DB2 版本中遇到了问题,用户尝试运行查询,但发现它失败了,因为他们的用户配置文件已被禁用。为了在 DB2(IBM i 上)上运行查询,连接字符串中提供了用户的配置文件名称和密码。服务器上的安全性可以指定在两次或三次错误登录后禁用用户的配置文件。

问题:
我调试了应用程序,发现问题归结为查询提交了两次。如果用户的密码错误,那么当然,这会产生禁用其个人资料的连锁反应。

进一步检查,当我检查服务器上的日志时(在逐行调试时),我发现当您调用 TADOQuery.sql.add() 时,查询已提交到服务器,而当 TADOQuery 的active 属性设置为 true(这是我希望将查询提交到服务器的点)。这是我用来运行查询的代码示例:

adoqry.active := false;
adoqry.sql.clear;
adoqry.sql.add('SELECT * FROM SOMEDB.SOMETABLE');
adoqry.active := true;

因此,我的问题很简单:
1. 为什么 TADOQuery.sql.add() 方法提交查询(当它应该只是将 sql 添加到 TADOQuery 的 sql 属性时)?
2. 我能做些什么来防止这种情况发生?即当我调用 add() 方法时,有什么方法可以防止 sql 被提交?

对于那些想要有关日志的额外信息的人,IBM i 上的出口点日志显示,当我在上面的示例中调用 adoqry.sql.add 时,查询是通过“数据库服务器-SQL 请求”出口运行的点应用程序,通过“准备和描述”功能。当我在上面的示例中调用 adoqry.active := true 时,相同的查询通过相同的出口点应用程序,但通过“打开/描述”功能。

如果您不熟悉 IBM i,请不要担心 - 我只是将这些信息包括在内,以证明我已经跟踪了两次提交的查询。真正的问题在于 TADOQuery 的 sql.add() 处理。

4

1 回答 1

2

根据您对问题的描述,我假设您指定了 ADOQuery 的 ConnectionString。这样做将数据库登录与查询的运行结合起来。您发现当用户的凭据无效时,这会产生不良的副作用。

使用 ADOConnection 将数据库登录与查询分开。指定 ADOConnection 的 ConnectionString 并将 ADOConnection 分配给 ADOQuery.Connection 属性。这样,您可以控制数据库登录,并可以捕获使用错误凭据的登录。此外,ADOConnection.Open 方法允许您指定用户名和密码,因此您不必将它们放在 ConnectionString 中。

虽然这不能回答您的具体问题,但这种方法将通过将登录与查询的运行分开来帮助您解决用户配置文件被禁用的问题。

于 2011-08-03T23:23:56.073 回答