Delphi 运算符未重载:“0”;常量字符串“+&引用;“非类型化”;

Delphi 运算符未重载:“0”;常量字符串“+&引用;“非类型化”;,delphi,comparison,operator-overloading,pascal,procedure,Delphi,Comparison,Operator Overloading,Pascal,Procedure,我从一个数据集读入一个SQL函数,然后将其写入一个文件,我创建了一个小过程,检查空字段,然后用null替换它们,非空字段周围有引号 然而,当我开始编译时,我得到了错误 Error: Operator is not overloaded: "Constant String" + "untyped" 坦白地说,我不知道这意味着什么,我检查了fpc解析器消息帮助,它说 You’re trying to use an overloaded operator when it is not overloa

我从一个数据集读入一个SQL函数,然后将其写入一个文件,我创建了一个小过程,检查空字段,然后用null替换它们,非空字段周围有引号

然而,当我开始编译时,我得到了错误

Error: Operator is not overloaded: "Constant String" + "untyped"
坦白地说,我不知道这意味着什么,我检查了fpc解析器消息帮助,它说

You’re trying to use an overloaded operator when it is not overloaded for this type.
这让我更加困惑。有人能帮我吗?我想这是因为我在我的程序中做了一个比较,但可能是错误的

procedure isNull(str : AnsiString);
  begin
    if str = EmptyStr then
      str := Null
    else
      str := '' + str + '';
  end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  addLine, f : string;
  list : TStringList;
begin
  f := 'info.sql';
  list := TStringList.Create;

  with AddressData do begin
    for i := 0 to RecordCount do begin

    RecNo := i;
    addLine := 'CALL CONT__Add(' + isNull(Fields[0].AsString) +')'; // Much more of this but fails at first call of procedure
    list.Add(addLine);
    end;
  list.SaveToFile(f);
  list.free;
   end;
end;
这会失败,因为
isNull
是一个过程,因此不会进行任何计算。为了让这段代码编译
isNull
,需要一个返回类型可以强制为字符串的函数

我发现很难知道你应该如何改变你的程序,因为它试图做什么并不明显。不仅仅是因为名为
isNull
的函数应该根据null测试其输入并返回布尔值

我也承认我当时很困惑

str := '' + str + '';
它什么也不做,不修改
str
的值

我最好的猜测是你想要这样的东西:

function PrepareField(const str: string): string;
begin
  if str = '' then
    Result := Null
  else
    Result := '''' + str + '''';
end;

这段代码让我担心SQL注入。您考虑过该风险了吗?

定义isNull如下编译。谢谢你的指点,大卫

function isNull(str : AnsiString) : String;
begin
  if str = EmptyStr then
    str := Null
  else
    str := '' + str + '';
  isNull := str;
end; 

您的代码中有几个错误

procedure isNull(str : AnsiString); // str assignments inside procedure does not takes effect outside procedure, use var str
  begin
    if str = EmptyStr then
      str := Null // Incompatible types AnsiString (str) and Variant (Null). May be you means 'Null' (in quotes)?
    else
      str := '' + str + ''; // concatenation with empty strings, use QuotedStr(str)
  end;

正如@DavidHeffernan所说,
isNull
是一个过程,不能以函数方式使用。

Ack,学童错误,我认为过程也可以返回。感谢您的帮助。
Null()
返回一个
变量
,然后将其转换为
字符串
。当
str
为空时,您应该返回一个空字符串
'
,而不是调用
Null()
@Remy,除非
Null
在本地定义为某物else@DavidHeffernan:这在张贴的问题中并不明显。由于它使用的是RTL的
EmptyStr
const,因此推测它也使用了RTL的
Null
@Remy副本,这是FPC而不是Delphi。如果Null真的是Variants.Null,那么它在SQL查询中就没有多大用处了。您不能100%确定空值是什么。
procedure isNull(str : AnsiString); // str assignments inside procedure does not takes effect outside procedure, use var str
  begin
    if str = EmptyStr then
      str := Null // Incompatible types AnsiString (str) and Variant (Null). May be you means 'Null' (in quotes)?
    else
      str := '' + str + ''; // concatenation with empty strings, use QuotedStr(str)
  end;