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)
这个问题
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'前缀通常会引导读者期望一个整数.
| 归档时间: |
|
| 查看次数: |
1093 次 |
| 最近记录: |