delphi 使用ADO代码向Pervasive数据库添加UDF

64jmpszr  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(75)

我在一个文本文件中有一个CREATE FUNCTION语句。我需要在运行时使用ADO和OLEDB提供程序将此函数添加到普适数据库(最低版本13)中。我可以使用ODBC,如果这是它需要的。
我已经设置了一个ADOCommand对象和一个ADOQuery对象。我删除了这个函数,如果它像这样存在:

cmd.CommandText := format('DROP FUNCTION IF EXISTS %s', [GetFunctionName(sl.Text)]);  // sl is a StringList containing the content of the file
cmd.Execute;

然后我尝试执行CREATE FUNCTION文本如下:

qry.SQL.Text := sl.Text;  // sl is a StringList containing the content of the file 
qry.Prepared := true;
qry.Parameters.Clear;
qry.ExecSQL;
{  or this way
cmd.CommandText := sl.Text;  // sl is a StringList containing the content of the file
cmd.Parameters.Clear;
cmd.Execute;
}

我使用命令或查询来执行文本时得到此错误:

我认为这是因为PSQL中的变量由前导“:”标识,ADO认为它们是参数占位符。下面是我的CREATE FUNCTION文本的一个片段作为示例:

CREATE FUNCTION FormatDate(:sDate char(8))
--Version 2
--Comment Convert Sympac date string to DD/MM/YYYY
--Group Conversion
RETURNS char(10)
AS
BEGIN
DECLARE :dd char(2)
DECLARE :mm char(2)
DECLARE :yyyy char(4)

如何使用ADO运行CREATE FUNCTION文本?提前感谢:)

ki1q1bka

ki1q1bka1#

你们关系很好是 Delphi 本身在支持SQL中的命名参数时使用:NAME语法将参数转换为?语法。你需要在它碍事的时候把它关掉。
关闭ParamCheck。

cmd.Parameters.Clear;
cmd.ParamCheck := false;
cmd.CommandText := sl.Text;  
cmd.Execute;

ParamCheck的 Delphi 帮助中提到:
此属性对于数据定义语言(DDL)语句很有用,这些语句包含作为DDL语句一部分的参数,但不是ADO命令组件的参数。例如,用于创建存储过程的DDL语句可以包含作为存储过程的一部分的参数语句。将ParamCheck设置为false可防止将这些参数误认为是执行DDL语句的ADO命令组件的参数。

相关问题