我们测试D5项目(使用IB2009Server和IBProvider)到XE6的迁移,使同一IB服务器保持ADO提供程序。该项目大量使用存储过程(SPs)。
在创建数据库时(以编程方式,使用IB ),在创建(使用TAdoQuery)表、异常和声明(也使用TAdoQuery)几个UDF之后,我们在两次传递中完成了SPs的创建(仍然使用TAdoQuery)。
传递1。使用SQL命令创建过程,我们创建所有的 SPs与琐碎的主体。
PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
EXIT; <-- trivial body
END;通过2.使用ALTER程序,每个SP被赋予其适当的主体。
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;对于任何想要进行测试的人:在这个特定的主体中引用的表代码的元数据是
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中的简单冒号,我们无法达到目标。我们会得到
EOleException
ErrorCode=-2146824580 ($800A0E7C)
Msg=<"Parameter object is improperly defined. Inconsistent or incomplete information was provided"这意味着现在轮到ADO不满意了。
问题:如何使用TAdoQuery和SQL命令ALTER,将上面的第一个SPs更改为第二个?
发布于 2015-01-27 12:05:17
在代码中将SQL分配给TAdoQuery时,请确保在分配SQL语句之前设置了ParamCheck := False。否则,Params列表仍将被填充。
https://stackoverflow.com/questions/28156396
复制相似问题