2014-06-21 54 views
0

IT只是另一項任務。問題是:在.MDB中搜索標題

btnSearch:用戶必須能夠通過輸入書名來搜索書籍。使用輸入框從用戶獲取標題。顯示標題和ISBN號

我有數據庫與多個表,其中有多個列。書名在tblBooks表中。

這裏的那一刻我Delphi代碼:

procedure TfrmLibrary.btnSearchClick(Sender: TObject); 
var 
    sBookName : String; 
begin 
    sBookName := InputBox('Enter book Name','','') ; 
    qryLibrary.Active := False; 
    qryLibrary.SQL.Text := 'SELECT * FROM tblBooks WHERE TITLE = ' + sBookName + ' ;'; 
    qryLibrary.Active := True; 

它給了我一個錯誤說:

項目問題1出現的異常類EOLeException與消息「參數Karoonag沒有默認值」進程停止

哦,'Karoonag'是書的標題。 請給我一隻手在這裏D:

+1

我想知道爲什麼人們不把生成的SQL查詢字符串寫入備忘錄,複製粘貼它並直接在DB系統上測試查詢字符串。也許把查詢字符串變成Memo'Memo1.Lines:= Qry.SQL;' –

回答

0

好吧,我發現我做錯了。

我在哪裏做的sql文本,我錯過了本書的引號。下面是我的代碼:

procedure TfrmLibrary.btnSearchClick(Sender: TObject); 
var 
    sBookName : String; 
begin 
    sBookName := InputBox('Enter book Name','','') ; 
    qryLibrary.Active := False; 
    qryLibrary.SQL.Text := 'SELECT * FROM tblBooks WHERE TITLE = "' + sBookName + '" ;'; //<--- "" 
    qryLibrary.Active := True; 
+2

這是一個子解決方案。想想書名包括一個或多個引號時會發生什麼。你的SQL看起來像什麼?當惡意或惡作劇的用戶利用它時,它被稱爲* SQL注入*。通過使用*參數化*查詢來避免它。 (斜體部分是你應該查找的術語,或者在課堂上向你的導師詢問。) –

+3

同意Rob。有關使用參數化查詢的示例,請參閱[本答案](http://stackoverflow.com/a/22482437)。它演示瞭如何將它們用於INSERT,但對於SELECT或UPDATE SQL語句這個概念是相同的。如果你堅持要自己連接字符串,至少應該使用'QuotedStr'函數來實現;它會正確地逃脫嵌入式報價。 –