Проблема с
qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = iID ' )
заключается в том, что он не вводит значение переменной iID
в оператор DELETE, как вы, очевидно, поняли.
В равной степени проблема с
qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + QuotedStr(iID))
заключается в том, что он окружает значение iID кавычками, так что механизм Sql, выполняющий оператор DELETE, на самом деле видит что-то вроде
DELETE FROM Doctors WHERE DoctorID = '99'
но DoctorID - это целочисленный столбец, а не строковый.
Итак, поскольку ваш столбец идентификаторов является столбцом целочисленного типа, попробуйте вместо этого (но см. Ниже об опасностях Sql Injection):
qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + iID);
Айоу, вам не нужны кавычки вокруг целочисленных значений.
Параметризованная версия вашего оператора DELETE
будет лучшим решением:
qryDoctors.SQL.Text := 'DELETE FROM Doctors WHERE DoctorID = :DoctorID';
qryDoctors.ParamByName('DoctorID').Value := StrToInt(iID);
Одна из причин, по которой это лучше, заключается в том, что он невосприимчив к Sql Injection (см. https://en.wikipedia.org/wiki/SQL_injection), в то время как ваш способ сделать это, позволяя пользователю указать часть SQL с помощью InputQuery, а затем объединить его с другим текстом DELETE, не подходит. На самом деле объединение пользовательского ввода в оператор SQL — это именно то, что позволяет использовать Sql Injection — например, злоумышленник может добавить другой оператор (или больше) в конец того, который вы вводите. здание, например DROP TABLE Employee
(или хуже). Возможность для этой пользовательской подрывной версии инструкции Sql никогда не возникает, когда запрос параметризован.
Fwiw, причина, по которой мне лично не нравится использовать свойство Value
TParameter, заключается в том, что это вариант, поэтому подрывает ввод данных для указанного значения.
Кстати, iID
— не очень хорошее имя для переменной, которая на самом деле является строкой. Префикс «i» обычно заставляет читателей ожидать целое число.
person
MartynA
schedule
23.08.2016
:Param01
в своем предложении, а затем каким-то образом передаете значение - person rgoliveira   schedule 23.08.2016InputBox()
возвращает значение параметраADefault
, если пользователь отменяет диалог. В данном случае это пустая строка. Или вместо этого используйтеInputQuery()
, который возвращаетBoolean
, указывающий, был ли диалог принят или отменен. Но пользователь по-прежнему может ввести пустое значение. В любом случае перед подготовкой SQL-запроса следует проверить наличие недопустимых входных данных. - person Remy Lebeau   schedule 23.08.2016