我正在尝试编写一个登录过程,但是在尝试执行包含将来自用户输入的变量的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)
当我尝试使用这样的变量时,我得到"缺少运算符"或"分号错误"或"未终结字符串".为什么是这样?
您的引号字符在它们之间有额外的空格,您需要删除它们. ' ' '解析方式不同于''':
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)