在TAdoQuery上使用ConnectionString而不是TAdoConnection

时间:2010-07-19 16:18:42

标签: delphi ado

我从Delphi中的TAdoQuery派生了自己的组件。我已经覆盖了 DoAfterPost 程序;在此代码中,我创建了另一个查询,目的是获取与插入记录关联的主键(即SqlServer的 SELECT @@ IDENTITY ,MySql的 SELECT LAST_INSERT_ID()等等。)

过去,我总是使用 TAdoConnection 进行数据库连接。在DoAfterPost中进行的“子查询”调用中没有问题,因为它是SAME 会话(这些查询检索最后插入的主键假设持久数据库连接)。

我最近做了一个选项,而不是使用 TAdoConnection 连接,而是设置 ConnectionString 属性(用于多重thrading目的)。但这会产生问题,因为生成的子查询不会使用与主查询相同的会话。因此它不会返回主键值。

我的问题是,如果使用 ConnectionString ,TAdoQuery是否有任何连接属性?然后我可以 daisychain 这个连接/会话到我的子查询。或者是通过TAdoConnection实现这一目标的唯一方法吗?

1 个答案:

答案 0 :(得分:2)

@M Schenkel,当您设置ConnectionString组件的TADOQuery属性时,TAdoQuery会使用新的会话ID创建与数据库的新连接。

@@IDENTITY SQL Server函数返回当前会话中最后插入的标识值,因为您需要对insert语句使用相同的Connection(和会话)查询SELECT @@IDENTITY

作为sql server中的解决方法,您可以使用IDENT_CURRENT函数,但不限于会话。

在MySql中,LAST_INSERT_ID()函数也适用于perconnection。因此行为类似于函数@@IDENTITY

简而言之,您拥有的最佳选择是使用唯一的TAdoConnection对象。