英文:
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执行文本时,我会得到以下错误:
我认为这是因为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文本?
提前谢谢
英文:
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:
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
答案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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论