如何在delphi的postgresql COPY命令中插入带单引号的文件名,参数?

如何在delphi的postgresql COPY命令中插入带单引号的文件名,参数?,sql,postgresql,delphi,parameters,pascal,Sql,Postgresql,Delphi,Parameters,Pascal,我在delphi中尝试在Postgresql脚本中包含一个文件名时感到很有趣,所需的字符串是 COPY myschema.mytable FROM 'c:\data\data.csv' CSV HEADER; 我知道postgresql可以解析这个SQL查询,因为我已经在pgadmin中对它进行了测试,问题是如何在Delphi中生成它。Delphi对字符串使用单引号,因此即使使用QuotedStr方法 TempSQL := 'COPY myschema.mytable FROM '+Quo

我在delphi中尝试在Postgresql脚本中包含一个文件名时感到很有趣,所需的字符串是

  COPY myschema.mytable FROM 'c:\data\data.csv' CSV HEADER;
我知道postgresql可以解析这个SQL查询,因为我已经在pgadmin中对它进行了测试,问题是如何在Delphi中生成它。Delphi对字符串使用单引号,因此即使使用QuotedStr方法

TempSQL := 'COPY myschema.mytable FROM '+QuotedStr(myfilename)+ ' CSV HEADER';
ADOQuery1.SQL.Add (TempSQL);
该字符串生成为

COPY myschema.mytable FROM ''c:\data\data.csv'' CSV HEADER;
所以我试着使用Parameters.parabyname,比如

TempSQL := 'COPY myschema.mytable FROM :PFileName CSV HEADER';
ADOQuery1.SQL.Add (TempSQL);
FileNameParam := LQuery.Parameters.ParamByName('PFileName');
FileNameParam.DataType := ftstring;
FileNameParam.Value := 'c:\data\data.csv';
ADOQuery1.Open;
给出错误:错误:语法错误在“$1”处或附近;执行查询时出错$1通常是由paramnames与列名相同引起的,这里不是这样,我尝试了不同的paramnames。我认为问题在于Parambyname可能不适用于这种类型的参数,它通常是这样使用的

    SELECT * FROM myschema.mytable WHERE myfield = :myparameter

即冒号位于an=之后,而copy命令的情况并非如此。欢迎任何建议。delphi代码基本上扫描目录中(1000个)合适的文件,并记录导入的内容,也许我必须以完全不同的方式与db交互。

此代码在快速测试应用程序中运行良好,并在调用
ShowMessage
时显示正确引用的字符串,这意味着在你的代码中除了你在这里向我们展示的东西之外还有别的东西

procedure TForm4.FormCreate(Sender: TObject);
var
  TempStr: string;
  MyFileName: string;
begin
  MyFileName := 'somefile.txt';
  TempStr := 'COPY myschema.mytable FROM ' + QuotedStr(myfilename) + ' CSV HEADER';
  ShowMessage(TempStr);
end
生成的对话框:


如果您尝试
TempSQL:=“从“”+myfilename+”'CSV HEADER'复制myschema.mytable,会发生什么情况
注意
CSV头前面的空格,使用三个引号,它将外部两个单引号解析为双引号,如(“'filename'),并返回错误:无法打开文件“'c:\data\data.CSV'”进行读取:无效参数SQL state:xx000使用双引号返回此错误:语法错误位于或接近“c”第1行:从“c:\data\data.csv…”复制myschema.mytable…^**********错误*********错误:位于或接近“c”SQL状态的语法错误:42601字符:43第一个示例中的代码与给定的输出不匹配
TempSQL
在“CSV”之前没有空格。你确定没有遗漏任何其他内容吗?对不起,我已在原问题中插入了缺少的空格。命令之间的间隔都存在于实际脚本中,该脚本从delphi ide复制到pgadmin进行双重检查,这就是中间tempsql字符串变量的原因。Ken,是的,我现在意识到,delphi IDE>object inspector中用于检查参数的右键单击>copvalue功能不会提供与showmessage(TempSQL)或Writeln(TempSQL)相同的输出。所以QuotedStr方法毕竟是有效的