我们测试D5项目(使用IB 2009 Server和IBProvider)到XE6的迁移,使相同的IB服务器保持为ADO提供商。该项目大量使用存储过程(SP)。
在数据库创建时(以编程方式,使用IB API),在创建(使用TAdoQuery)表,异常和声明(也使用TAdoQuery)几个UDF之后,我们在两次传递中创建SP(仍然使用TAdoQuery)。 / p>
传递1.使用SQL命令CREATE PROCEDURE,我们创建具有普通主体的所有 SP,例如
PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
EXIT; <-- trivial body
END;
传递2.使用ALTER PROCEDURE,每个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;
对于任何想要进行测试的人:此特定机构中提到的表CODES的元数据是
CREATE TABLE "CODES"
("C_CODE" VARCHAR(5) NOT NULL,
PRIMARY KEY ("C_CODE"));
这两个过程是为了克服SPs依赖的障碍。
在D5中,有必要尊重在TAdoQuery.SQL中使用的丑陋“约定”,使用双冒号(而不是冒号)来为SP体内发生的SQL命令中引用的SP参数添加前缀。想象一下上面的SP - 它的整个主体是一个单独的SQL命令 - 它的冒号加倍。无论“丑陋”惯例的细节如何,在D5中SP的创作都“按预期”发挥作用。
现在我们在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 PROCEDURE,可以将上述第一个SP改为第二个SP?
答案 0 :(得分:1)
在代码中将SQL分配给TAdoQuery时,请确保在分配SQL语句之前设置了ParamCheck := False
。否则,仍会填充Params
列表。