2016-08-23 3 views
1

데이터베이스에서 DoctorID는 정수 열입니다. 편집 된 "//"코드 줄도 작동하지 않습니다. 누군가가 SQL 문에서 정수 값을 올바르게 지정하는 방법을 보여줄 수 있다면 정말 고마워 할 것입니다.델파이의 SQL (삭제) 문에 정수 값을 포함하는 방법

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

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

문제 은 분명히 수집 한대로, DELETE 문에 변수 iID의 값을 도입하지 않는다는 것입니다.

마찬가지로,

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

의 문제는 무엇 실제로 DELETE 문을 실행하는 SQL 엔진이보고하는

DELETE FROM Doctors WHERE DoctorID = '99' 

같은이되도록이, 따옴표 IID의 값을 둘러싸이다 DoctorID는 문자열이 아닌 정수 열입니다. 귀하의 ID 열이 정수 열 유형이기 때문에

그래서, 대신에 이것을 시도 (그러나 SQL 인젝션의 위험에 대해 아래 참조) :

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

갔나, 당신은 정수 값에 따옴표가 필요하지 않습니다. 수 있도록하여, 그 일의 당신의 방법 반면, (https://en.wikipedia.org/wiki/SQL_injection 참조)이이

qryDoctors.SQL.Text := 'DELETE FROM Doctors WHERE DoctorID = :DoctorID'; 
qryDoctors.ParamByName('DoctorID').Value := StrToInt(iID); 

이유 중 하나는 더 나은는 SQL 인젝션 면역 점이다 :

당신의 DELETE 문의 매개 변수화 된 버전이 더 나은 해결책이 될 것입니다 사용자가 InputQuery를 사용하여 SQL의 일부를 지정한 다음 다른 DELETE 텍스트와 연결하는 것은 아닙니다. 사실, 사용자 입력을 SQL 문에 연결하면 정확히입니다. Sql Injection 익스플로잇을 허용하는 것입니다. 예를 들어, 악의적 인 사용자가 작성중인 문장의 끝 부분에 다른 문장을 붙일 수 있습니다. DROP TABLE Employee (또는 그 이상) 쿼리가 매개 변수화 될 때 Sql 문의 사용자 전복 기회가 발생하지 않습니다.

내가 개인적으로 TParameter의 Value 속성을 사용하는 것을 싫어하는 이유는 변형이므로 데이터 값을 지정된 값으로 전복한다는 것입니다.

Btw, iID은 실제로 문자열 인 변수의 이름이 아닙니다. 'i'접두어는 일반적으로 독자가 정수를 예상하도록 유도합니다.

+1

'qryDoctors.SQL.Add ('DoctorID ='+ iID) DoctorsID = '+ iID);'이것은 SQL 주입 구멍입니다. – Johan

+0

@Johan : 나는 Sql Injection에 대해 언급하려고했지만, 어리 석질 수는 없었다. 나는 그것의 언급을 mo에 추가 할 것이다, 고마워. – MartynA

+0

@Johan : 다른 답변에 대한 "쓸모없는 것보다 나쁜"의견은 완벽하게 공정한 지적이었습니다. – MartynA