使用ADO代码将UDF添加到Pervasive数据库。

huangapple go评论69阅读模式
英文:

Using ADO code to add a UDF to Pervasive database

问题

我有一个在文本文件中的CREATE FUNCTION语句。
我需要在运行时使用ADO和OLEDB提供程序将此函数添加到Pervasive数据库(至少v13)。
如果需要,我可以使用ODBC。

我已经设置了一个ADOCommand对象和一个ADOQuery对象。
如果存在,我会像这样删除该函数:

cmd.CommandText := format('DROP FUNCTION IF EXISTS %s', [GetFunctionName(sl.Text)]); // sl是包含文件内容的StringList
cmd.Execute;

然后,我尝试执行CREATE FUNCTION文本,像这样:

qry.SQL.Text := sl.Text; // sl是包含文件内容的StringList
qry.Prepared := true;
qry.Parameters.Clear;
qry.ExecSQL;
{ 或者这样
cmd.CommandText := sl.Text; // sl是包含文件内容的StringList
cmd.Parameters.Clear;
cmd.Execute;
}

使用Command或Query执行文本时,我会得到以下错误:
使用ADO代码将UDF添加到Pervasive数据库。

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

CREATE FUNCTION FormatDate(:sDate char(8))
--版本 2
--注释 将Sympac日期字符串转换为DD/MM/YYYY
--组 转换
RETURNS char(10)
AS
BEGIN
DECLARE :dd char(2)
DECLARE :mm char(2)
DECLARE :yyyy char(4)

如何使用ADO运行我的CREATE FUNCTION文本?
提前谢谢 使用ADO代码将UDF添加到Pervasive数据库。

英文:

I have a CREATE FUNCTION statement in a text file.
I need to add this function to a Pervasive database (v13 minimum) at runtime using ADO and the OLEDB provider.
I could use ODBC if that is what it takes.

I have set up an ADOCommand object and an ADOQuery object.
I drop the function if it exists like so:

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

Then I try to execute the CREATE FUNCTION text like so:

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;
}

I get this error using either a Command or Query to execute the text:
使用ADO代码将UDF添加到Pervasive数据库。

I think this is because variables in PSQL are identified by a leading ":" and ADO thinks they are parameter placeholders.
Here is a snippet from my CREATE FUNCTION text as an example:

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)

How can I run my CREATE FUNCTION text using ADO?
Thanks in advance 使用ADO代码将UDF添加到Pervasive数据库。

答案1

得分: 1

你已经接近正确。是 Delphi 本身在支持使用 :NAME 语法的 SQL 命名参数时进行了转换,将其转换为 ? 语法。当它妨碍操作时,你需要关闭这个功能。

关闭 ParamCheck。

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

Delphi 的 ParamCheck 帮助文件中提到了这一点:

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

英文:

You were close. It is Delphi itself that in supporting named parameters in SQL using the :NAME syntax that does the conversion to ? syntax. You need to turn this off when it gets in the way.

Turn off ParamCheck.

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

The Delphi help for ParamCheck mentions this:

> This property is useful for data definition language (DDL) statements
> that contain parameters as part of the DDL statement and that are not
> parameters for the ADO command component. For example, the DDL
> statement to create a stored procedure may contain parameter
> statements that are part of the stored procedure. Set ParamCheck to
> false to prevent these parameters from being mistaken for parameters
> of the ADO command component executing the DDL statement.

huangapple
  • 本文由 发表于 2023年6月13日 11:38:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/76461551.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定