如何在delphi中的SQL(Delete)语句中包含整数值

Oce*_*ght 1 sql delphi delphi-2010 sql-delete

在数据库中,DoctorID是整数列.编辑后的"//"代码行都不起作用.如果有人能告诉我如何在SQL语句中正确指定整数值,我将非常感激.

procedure TForm1.btnDeleteDocClick(Sender: TObject);
var
  iID : Integer;
begin
  iID := StrToInt (InputBox('Delete Doctor','Please enter in your Doctor ID',''));
  with dmHospital do
  begin
    qryDoctors.SQL.Clear;
    //qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = iID ' ) ;
    //qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + QuotedStr(iID));
    qryDoctors.ExecSQL;
    qryDoctors.SQL.Clear;
    qryDoctors.SQL.Add('SELECT * FROM Doctors');
    qryDoctors.Open;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ynA 5

这个问题

qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = iID ' )
Run Code Online (Sandbox Code Playgroud)

就是你没有将变量的值引入iIDDELETE语句,因为你显然已经收集了它.

同样,问题所在

qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + QuotedStr(iID))
Run Code Online (Sandbox Code Playgroud)

是它用引号包围iID的值,以便执行DELETE语句的Sql引擎实际看到的是类似的东西

DELETE FROM Doctors WHERE DoctorID = '99'
Run Code Online (Sandbox Code Playgroud)

但是DoctorID是Integer列而不是字符串1.

因此,由于您的ID列是整数列类型,请尝试这样做(但请参阅下面有关Sql Injection的危险):

qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + iID);
Run Code Online (Sandbox Code Playgroud)

哇,你不需要围绕整数值的引号.

DELETE声明的参数化版本将是更好的解决方案:

qryDoctors.SQL.Text := 'DELETE FROM Doctors WHERE DoctorID = :DoctorID';
qryDoctors.ParamByName('DoctorID').Value := StrToInt(iID);
Run Code Online (Sandbox Code Playgroud)

这个更好的一个原因是它不受Sql Injection的影响(参见https://en.wikipedia.org/wiki/SQL_injection),而你的方式可以通过允许用户使用InputQuery指定部分SQL来实现.然后将它与其他DELETE文本连接起来,不是.实际上,将用户输入连接到SQL语句正是允许Sql Injection利用的东西 - 例如,恶意用户可以将另一个语句(或更多)添加到您正在构建的语句的末尾,例如DROP TABLE Employee(或更糟) .当查询参数化时,这种用户颠覆Sql语句的机会永远不会出现.

Fwiw,我个人不喜欢使用ValueTParameter 的属性的原因是它是一个变体,所以颠覆​​了指定值的数据类型.

顺便说一句,iID对于一个实际上是字符串的变量来说,这不是一个很好的名字.'i'前缀通常会引导读者期望一个整数.