概述:
我编写了一个应用程序,允许用户定义查询,将其提交给服务器并查看结果。该软件可以在DB2或MySQL上运行。
问题:
我们在DB2版本中遇到了用户尝试运行查询的问题,并发现它已失败,因为他们的用户配置文件已被禁用。为了在DB2(在IBM i上)上运行查询,在连接字符串中提供了用户的配置文件名称和密码。服务器上的安全性可以指定在两次或三次不正确登录后禁用用户的配置文件。
问题:
我调试了应用程序,发现问题归结为提交两次的查询。如果用户的密码错误,那么当然这会产生禁用其个人资料的连锁效应。
进一步检查时,当我检查服务器上的日志时(逐行调试),我发现当你调用TADOQuery.sql.add()时,查询被提交给服务器了,当TADOQuery的活动属性设置为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时,查询是通过“Database Server-SQL”运行的请求“退出点申请,通过功能”准备和描述“。当我在上面的示例中调用adoqry.active:= true时,相同的查询将通过相同的退出点应用程序,但通过“打开/描述”功能。
如果您不熟悉IBM i,请不要担心 - 我只是将该信息作为我跟踪提交两次查询的证据。真正的问题在于TADOQuery的sql.add()处理。
答案 0 :(得分:2)
根据您对问题的描述,我假设您指定了ADOQuery的ConnectionString。这样做可以将数据库登录与查询的运行相结合。您发现当用户凭据无效时,这会产生不良副作用。
使用ADOConnection将数据库登录名与查询分开。指定ADOConnection的ConnectionString,并将ADOConnection分配给ADOQuery.Connection属性。这样,您可以控制数据库登录,并可以捕获具有错误凭据的登录。此外,ADOConnection.Open方法允许您指定用户名和密码,因此您不必将它们放在ConnectionString中。
虽然这不能回答您的具体问题,但这种方法可以帮助您通过将登录与运行查询分开来解决用户配置文件被禁用的问题。