- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 TADOQuery,如果我硬编码“Where 参数”,它会生成一个临时表,它工作正常,但如果我使用 TADO 参数,则下一个查询不知道临时表。
我做错了什么?
我希望我可以简化这个例子,但它就是这样。(SQL 服务器)
CREATE TABLE brFTNode_Children (
pID integer NOT NULL,
cID integer NOT NULL,
primary key (pID, cID)
);
insert into brFTNode_Children values(1,2);
insert into brFTNode_Children values(1,3);
insert into brFTNode_Children values(3,4);
insert into brFTNode_Children values(3,5);
insert into brFTNode_Children values(6,4);
insert into brFTNode_Children values(6,7);
代码(不起作用)
procedure Foo(fDBCon : TADOConnection);
const
CreateTempTable =
'WITH FT_CTE AS( ' +
'SELECT pID, cID FROM brFTNode_Children ' +
'WHERE pID = :TOPID ' +
'UNION ALL ' +
' SELECT e.pID, e.cID FROM brFTNode_Children e ' +
' INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)) ' +
'SELECT * INTO #ParentChild FROM FT_CTE; ';
GetSQL =
'SELECT pID, cID FROM #ParentChild ORDER BY pID; ';
var
q1 : TADOQuery;
q2 : TADOQuery;
begin
q1 := TADOQuery.Create(nil);
q1.Connection := fDBCon;
q1.SQL.Text := CreateTempTable;
q1.ParamCheck := True;
q1.Parameters.ParamByName('TOPID').DataType := ftInteger;
q1.Parameters.ParamByName('TOPID').Value := 1;
q1.ExecSQL;
q2 := TADOQuery.Create(nil);
q2.Connection := fDBCon;
q2.SQL.Text := GetSQL;
q2.Active := true; //Fails here does not know table #ParentChild
end;
代码 - 使用 SQL 查询中的常量
function TGenerateSolveFile.GetBinaryStream( topID : Cardinal;
var bFile: TMemoryStream): Boolean;
const
CreateTempTable =
'WITH FT_CTE AS( ' +
'SELECT pID, cID FROM brFTNode_Children ' +
'WHERE pID = 1 ' + //Changed To a constant
'UNION ALL ' +
' SELECT e.pID, e.cID FROM brFTNode_Children e ' +
' INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)) ' +
'SELECT * INTO #ParentChild FROM FT_CTE; ';
GetSQL =
'SELECT pID, cID FROM #ParentChild ORDER BY pID; ';
var
q1 : TADOQuery;
q2 : TADOQuery;
begin
q1 := TADOQuery.Create(nil);
q1.Connection := fDBCon;
q1.SQL.Text := CreateTempTable;
// q1.ParamCheck := True;
// q1.Parameters.ParamByName('TOPID').DataType := ftInteger;
// q1.Parameters.ParamByName('TOPID').Value := 1;
q1.ExecSQL;
q2 := TADOQuery.Create(nil);
q2.Connection := fDBCon;
q2.SQL.Text := GetSQL;
q2.Active := true;
end;
最佳答案
参数化查询正在使用 exec sp_executesql
,它有自己的 session 。
您将从探查器中获得此信息。
exec sp_executesql N'WITH FT_CTE AS( SELECT pID, cID FROM brFTNode_Children WHERE pID = @P1 UNION ALL SELECT e.pID, e.cID FROM brFTNode_Children e INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)) SELECT * INTO #ParentChild FROM FT_CTE;
',N'@P1 int',1
如果您在 SSMS 中执行此操作并随后调用 select * from #ParentChild
,您将收到相同的错误。
sp_executesql
has the same behavior asEXECUTE
with regard to batches, the scope of names, and database context. The Transact-SQL statement or batch in thesp_executesql
@stmt
parameter is not compiled until thesp_executesql
statement is executed. The contents of@stmt
are then compiled and executed as an execution plan separate from the execution plan of the batch that calledsp_executesql
. Thesp_executesql
batch cannot reference variables declared in the batch that callssp_executesql
. Local cursors or variables in thesp_executesql
batch are not visible to the batch that callssp_executesql
. Changes in database context last only to the end of thesp_executesql
statement.
关于sql-server - 如果查询中有参数,TADOQuery 临时表就会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550791/
使用 Delphi 2010 谁能告诉我我的代码做错了什么。注释显示了我使用尝试将参数传递给 ADOQuery 的特定方法时收到的错误 procedure CreateAdminLogin(const
我对 TADOQuery 的行为感到困惑,我们就打Q .当我使用 Q.Edit ,填充一些字段,然后 Post ,它最终实际上插入了一条新记录。 代码很简单,从对象中读取ID: Q.SQL.Text
Delphi TAdoQuery 是否可以一次性执行多个插入,或者是否必须单独执行每个语句?我想做的是这样的: AdoQuery.SQL.Clear; AdoQuery.SQL.Add('INSERT
快速提问(希望如此) 我有一个大型数据集(>100,000 条记录),我想将其用作查找以确定多个键是否存在。这样做的目的是在尝试将 FK 违规提交到数据库之前找到它们,以避免由此产生的 EDataba
我正在使用 Delphi 5 和 ADO 开发一个小型糖尿病程序。我做了一个像这样的小查询: function GetLowestGlucoseLevel(StartDate:string;EndDa
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: How to run a database script file from Delphi? 我有一个非常长的 SQ
我在 TADOQuery 方面遇到了一个大问题: 这是我的 SQL: select cast(-10 as number(9)) foo, -10 bar from dual 当您添加“foo”字
我有一个简单的基本问题,我尝试使用 Insert 语句将图像插入数据库,其他列值也使用 TADOQuery 组件。 由于代码已经由某人编写,因此我想在此处放置一些虚拟示例代码,以供您澄清相应的步骤。
我使用此代码将行从 Table1 复制到 Table2,但它给了我 Command Text does not return a result set ADOQuery1.Close; ADOQu
我试图只选择顶部 否 TADOQuery 中的项目,但是当我激活查询时它给了我和错误。似乎找到了top参数就好了,但是执行的时候没能替换掉。如果我不使用“Top N”限制 SQL 语句,则代码可以正常
我通常使用带有持久字段的 TADOQuery(每个表 1 个),但现在我发现自己陷入了困境:我必须同时运行多个查询(只读)。 我发现了很多关于线程的文档。然而,这意味着每个操作都有一个新创建的 TAD
我有一个 TADOQuery,如果我硬编码“Where 参数”,它会生成一个临时表,它工作正常,但如果我使用 TADO 参数,则下一个查询不知道临时表。 我做错了什么? 我希望我可以简化这个例子,但它
假设我们有一个带有两个 TADOQuery 的标准主从关系。当在主数据集上进行导航时,详细数据集不会出现 AfterOpen 事件。 此事件在其他数据访问包(例如 BDE)中出现。为什么 dbGo 的
我有一个复杂的查询,其中包含多个必须替换相同主键值的位置。它看起来像这样: select Foo.Id, Foo.BearBaitId, Foo.LinkType,
我们使用具有显式连接的 Delphi TADOQuery 进行插入。 摘要:如果在查询处于 dsInsert 状态时连接丢失,查询似乎会进入与基础 ADO 记录集不一致的状态。因此,即使连接已重新建立
我在返回使用 TADOQuery 从简单 SELECT 查询获取的值时遇到问题 下面是我的代码: dbWizconQuery.SQL.Clear; dbWizconQuery.SQL.Add(
我有一个 Delphi 7 项目,我使用 TAdoQuery.ParseSql(); 来加载参数。现在我在XE4中编译它,参数类型有时是错误的。它实际上是 ftInteger,但创建为 ftSmall
使用单个TADOQuery,我使用左外连接从两个不同的表中提取记录: Select M*, D.* from Courier M Left outer join Courier_VT D on M.C
当将 TADOQuery 与 [eoAsyncFetchNonBlocking] 结合使用并附加到 OnFetchComplete 事件时,我发现 OnFetchComplete 未执行在主线程中(在
概述: 我编写了一个应用程序,允许用户定义查询,将其提交到服务器并查看结果。该软件可以在 DB2 或 MySQL 上运行。 问题: 我们在 DB2 版本中遇到了用户尝试运行查询的问题,但发现它失败了,
我是一名优秀的程序员,十分优秀!