Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TADOQuery SQL.add()提交/准备SQL_Delphi_Ado_Tadoquery - Fatal编程技术网

Delphi TADOQuery SQL.add()提交/准备SQL

Delphi TADOQuery SQL.add()提交/准备SQL,delphi,ado,tadoquery,Delphi,Ado,Tadoquery,概述: 我编写了一个应用程序,允许用户定义查询,将其提交到服务器并查看结果。该软件可以在DB2或MySQL上运行 问题: 我们在DB2版本中遇到了一些问题,其中一个用户试图运行一个查询,但发现它失败了,因为他们的用户配置文件已被禁用。为了在DB2(在IBMi上)上运行查询,连接字符串中提供了用户的概要文件名和密码。服务器上的安全性可以指定在两次或三次错误登录后禁用用户的配置文件 问题: 我调试了应用程序,发现问题在于提交了两次查询。如果用户的密码是错误的,那么当然,这会产生禁用其配置文件的连锁反

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

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

问题:
我调试了应用程序,发现问题在于提交了两次查询。如果用户的密码是错误的,那么当然,这会产生禁用其配置文件的连锁反应

在进一步检查中,当我检查了服务器上的日志(逐行调试时),我发现当您调用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.我能做些什么来防止这种情况?i、 当我调用add()方法时,是否有任何方法可以防止sql被提交

对于那些希望获得关于日志的额外信息的人,IBM i上的出口点日志显示,当我在上面的示例中调用adoqry.sql.add时,查询通过“Database Server sql Requests”出口点应用程序,通过函数“Prepare and description”运行。在上面的示例中,当我调用adoqry.active:=true时,相同的查询通过相同的出口点应用程序,但通过“Open/descripe”函数


如果您不熟悉IBMi,请不要担心,我只是将这些信息作为我跟踪两次提交的查询的证据。真正的问题在于TADOQuery的sql.add()处理。

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

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


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

我想知道是谁否决了您;因此+1,因为我认为这是一个非常有效的问题。@daemon-我试图通过假定“.sql.add”正在运行一个查询来判断这个问题是错误的。那当然是我的猜测。。OTOH,我绝对、绝对地同意,不加评论的向下投票毫无帮助,而且肯定不会以任何方式指导操作,无论是对是错。@Jeedee-你不能在
Recordset.Open上设置断点并检查调用堆栈吗(..
TCustomADODataSet.OpenCursor
在'ADODB.pas'中,它应该被点击两次。@Sertac-我同意你的观点:也许我的问题措辞不恰当。我很感激sql.add实际上没有运行查询。我认为它所做的是准备语句,而且它肯定在服务器上做了一些事情。正如我所说,我在我最初的问题中,我可以查看IBM I上的日志,如果我在.sql.add之后但在.active:=true之前放置断点,则请求将通过一个退出点(即,查询以某种方式提交给服务器-可能是为了准备它?)。将active设置为true将运行查询,并通过另一个退出点。@Sertac(从上面继续)-如果我可以附上一个屏幕截图,我可以向您展示日志,也许可以更好地解释发生了什么。的确,查询不会运行两次,但实际的查询语句被注册为通过两个不同的出口点(即,在sql.add上一次,在active上另一次:=True)。我认为它可能是在sql.add上准备语句,而不是运行语句,而这正是导致问题的原因。你是对的。在我提交问题之后(在你回答之前),我回去重新检查了代码,并注意到了这一点。出于某种原因,代码没有使用ADOConnection来建立连接。昨晚我没有时间检查,但今天我会检查它。感谢您在正确的方向上提供的提示。我应该自己注意到这一点,但出于某种原因,我没有注意到!连接ring是在ADOQuery上指定的,而不是在单独的ADOConnection上指定的。我现在在提交查询之前处理连接,并且禁用配置文件没有问题。