首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TAdoQuery修改IB存储过程

如何使用TAdoQuery修改IB存储过程
EN

Stack Overflow用户
提问于 2015-01-26 18:30:04
回答 1查看 567关注 0票数 1

我们测试D5项目(使用IB2009Server和IBProvider)到XE6的迁移,使同一IB服务器保持ADO提供程序。该项目大量使用存储过程(SPs)。

在创建数据库时(以编程方式,使用IB ),在创建(使用TAdoQuery)表、异常和声明(也使用TAdoQuery)几个UDF之后,我们在两次传递中完成了SPs的创建(仍然使用TAdoQuery)。

传递1。使用SQL命令创建过程,我们创建所有的 SPs与琐碎的主体。

代码语言:javascript
复制
PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
  EXIT;   <-- trivial body
END;

通过2.使用ALTER程序,每个SP被赋予其适当的主体。

代码语言:javascript
复制
PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
  SELECT MAX(C_CODE)
  FROM CODES
  WHERE C_CODE < :IN_PARAM
  INTO :OUT_PARAM;
END;

对于任何想要进行测试的人:在这个特定的主体中引用的表代码的元数据是

代码语言:javascript
复制
CREATE TABLE "CODES"
("C_CODE" VARCHAR(5) NOT NULL,
PRIMARY KEY ("C_CODE"));

这两次传球是为了克服SPs相互依赖的障碍。

在D5中,有必要遵守一个丑陋的“约定”,即在TAdoQuery.SQL中使用双冒号(而不是冒号)前缀SP命令中出现在SP主体中的SP参数。想象一下上面的SP --它的整个主体是一个SQL命令--它的冒号加倍。这是在D5中,SPs的创建“如预期的”工作,而不管“丑陋”公约的细节。

现在我们在XE6中,我们迅速地注意到,在这种特殊情况下--让我们称之为“带有参数的SP”(SPWP) --我们的D5方法失败了,因为IB不能容忍在D5中预处理的双冒号。不幸的是,使用TAdoQuery.Sql中的简单冒号,我们无法达到目标。我们会得到

代码语言:javascript
复制
EOleException 
ErrorCode=-2146824580 ($800A0E7C) 
Msg=<"Parameter object is improperly defined. Inconsistent or incomplete information was provided"

这意味着现在轮到ADO不满意了。

问题:如何使用TAdoQuery和SQL命令ALTER,将上面的第一个SPs更改为第二个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 12:05:17

在代码中将SQL分配给TAdoQuery时,请确保在分配SQL语句之前设置了ParamCheck := False。否则,Params列表仍将被填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28156396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档