【问题标题】:TADOQuery SQL.add() submitting/preparing the sqlTADOQuery SQL.add() 提交/准备 sql
【发布时间】:2011-08-03 15:18:56
【问题描述】:

概述:
我编写了一个应用程序,允许用户定义查询,将其提交到服务器并查看结果。该软件可以在 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() 处理。

【问题讨论】:

  • 我想知道谁对你投了反对票;因此+1,因为我认为这个问题非常有效。
  • @daemon - 我试图通过假设 '.sql.add' 正在运行查询来说明问题是错误地提出。这当然是我的猜测.. OTOH,我绝对,绝对同意没有评论的投票根本没有帮助,而且肯定不会以任何方式指导 OP,无论对错。
  • @Jeedee - 你不能通过在'ADODB.pas' 中的TCustomADODataSet.OpenCursor 中的Recordset.Open(.. 上放置断点并检查调用堆栈来到达任何地方,它应该被击中两次。
  • @Sertac - 我同意你的看法:也许我的问题措辞不当。我很欣赏 sql.add 实际上并没有运行查询的事实。我认为它正在做的是准备声明,它肯定是在服务器上做某事。正如我在最初的问题中所说,我可以查看 IBM i 上的日志,如果我在 .sql.add 之后但在 .active := true 之前放置一个断点,则请求通过退出点(即查询是以某种方式提交给服务器——也许是为了准备它?)。将 active 设置为 true 会运行查询,并通过不同的退出点。
  • @Sertac(续上) - 如果我可以附上屏幕截图,我可以向您展示日志,或许可以更好地解释正在发生的事情。确实,查询不会运行两次,但实际的查询语句被注册为通过两个不同的退出点(即一次在 sql.add 上,另一个在 active := true 上)。我认为它可能是在 sql.add 上准备语句,而不是运行它,这就是导致问题的原因。

标签: delphi ado tadoquery


【解决方案1】:

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

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

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

【讨论】:

  • 你是对的。在我提交了我的问题之后(在你回复之前),我回去重新检查了代码并自己注意到了这一点。出于某种原因,该代码不使用 ADOConnection 来建立连接。我昨晚没有时间检查,但我今天会调查一下。
  • 感谢您朝着正确的方向发展。我应该自己注意到这一点,但由于某种原因没有!连接字符串是在 ADOQuery 上指定的,而不是在单独的 ADOConnection 上。我现在在提交查询之前处理连接,并且配置文件被禁用没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多