在SQL语句中使用变量时编译器错误

-1 delphi delphi-7

我正在尝试编写一个登录过程,但是在尝试执行包含将来自用户输入的变量的SQL语句时,我遇到了问题.

以下是它的外观:

Var 
  SS,temp,fn,sn: string;
Begin 
  ADO := TDBClass.Create('ICAdatabase.mdb');

  SS:= 'SELECT * FROM Agents Where aName = '  '  ' + fn + ' ' '  And aSurname = ' ' ' + sn +  ' ' ' ';

  Temp := Ado.processquery(SS);
End;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这样的变量时,我得到"缺少运算符"或"分号错误"或"未终结字符串".为什么是这样?

Rem*_*eau 5

您的引号字符在它们之间有额外的空格,您需要删除它们. ' ' '解析方式不同于''':

SS := 'SELECT * FROM Agents Where aName = ''' + fn + ''' And aSurname = ''' + sn + '''';
Run Code Online (Sandbox Code Playgroud)

或者,使用#39而不是'':

SS := 'SELECT * FROM Agents Where aName = '#39 + fn + #39' And aSurname = '#39 + sn + #39;
Run Code Online (Sandbox Code Playgroud)

或使用QuotedStr()AnsiQuotedStr()代替:

SS := 'SELECT * FROM Agents Where aName = ' + QuotedStr(fn) + ' And aSurname = ' + QuotedStr(sn);
Run Code Online (Sandbox Code Playgroud)

SS := 'SELECT * FROM Agents Where aName = ' + AnsiQuotedStr(fn, #39) + ' And aSurname = ' + AnsiQuotedStr(sn, #39);
Run Code Online (Sandbox Code Playgroud)

此外,在旁注中,您正在泄漏您的ADO物体,并且Free在使用它时您没有使用它.

话虽如此,你真的应该停止手动构建SQL语句.请改用参数化查询(更快更安全).我不知道是什么TDBClass,但这是一个使用的例子TADOQuery:

var 
  fn, sn, temp: string;
Begin 
  fn := ...;
  sn := ...;

  Conn := TADOConnection.Create(nil);
  try
    Conn.ConnectionString := ...;

    ADO := TADOQuery.Create(nil);
    try
      ADO.Connection := Conn;

      ADO.SQL.Text := 'SELECT * FROM Agents Where aName = :AgentName And aSurname = :AgentSurname';

      ADO.Parameters.ParamValues['AgentName'] := fn;
      ADO.Parameters.ParamValues['AgentSurname'] := sn;

      ADO.Open;
      try
        if not (ADO.Bof and ADO.Eof) then
        begin
          // use ADO.Fields values as needed...
          Temp := ...;
        end;
      finally
        ADO.Close;
      end;
    finally
      ADO.Free;
    end;
  finally
    Conn.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)