2016-08-23 41 views
1

在數據庫中,DoctorID是一個整數列。編輯出來的「//」行代碼都不起作用。如果有人能告訴我如何在SQL語句中正確指定整數值,我將非常感激。如何在delphi中的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; 
+1

我不知道你正在使用哪個數據庫組件,而是搜索如何在SQL語句中使用參數。通常情況下,你會在句子中寫入':Param01',然後以某種方式傳遞該值 – rgoliveira

+0

如果用戶取消對話框,則InputBox()返回ADefault參數值。在這種情況下,這是一個空白字符串。或者,使用'InputQuery()'來代替,它返回一個表示對話是被接受還是被取消的'Boolean'。但用戶仍然可以輸入空白值。無論哪種方式,在準備SQL語句之前,您都應該檢查無效輸入。 –

回答

5

的問題

qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = iID ') 

是,它並沒有引入變量iID的價值爲DELETE語句,因爲你已經明顯聚集。

同樣,與

qryDoctors.SQL.Add('DELETE FROM Doctors WHERE DoctorID = ' + QuotedStr(iID)) 

的問題是,它環繞IID與報價的價值,這樣,所其實際執行DELETE語句的SQL引擎看到的是一樣的東西

DELETE FROM Doctors WHERE DoctorID = '99' 

但DoctorID是一個整數列而不是一個字符串。

所以,既然你的ID列是一個整數列類型,試試這個代替(但可以看看下面的SQL注入的危險):

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注入(參見https://en.wikipedia.org/wiki/SQL_injection),而你做這件事的方式,通過允許用戶使用InputQuery指定SQL的一部分,然後將其與其他DELETE文本連接起來則不是。事實上,將用戶輸入串聯到一個SQL語句中,正好是這個允許Sql Injection漏洞利用的東西 - 例如,惡意用戶可以在你正在構建的那個(例如,)的末尾添加另一個語句(或更多)。 DROP TABLE Employee(或更糟)。當查詢被參數化時,這個用戶顛覆Sql語句的機會永遠不會出現。

Fwiw,我個人不喜歡使用TParameter的Value屬性的原因是它是一個變體,所以在指定的值上顛覆了數據類型。

Btw,iID對於一個實際上是字符串的變量來說不是一個很好的名字。 '我'前綴通常會讓讀者期待一個整數。

+1

'qryDoctors.SQL.Add('刪除醫生WHERE DoctorID ='+ iID);'這是一個SQL注入漏洞。 – Johan

+0

@Johan:我打算提到Sql注入,但不能被破壞。我會在一個月內添加一個提及,謝謝。 – MartynA

+0

@Johan:對另一個答案完成並btw你的「比無用的」更糟糕的評論是一個完美的公平點。 – MartynA