2015-01-31 125 views
-1

一直試圖找出爲什麼以下登錄驗證過程不起作用。我有一個簡單的數據庫表,其中包含pupilID和密碼(在tblPupil中)。編譯時似乎連接正常,即程序Connection,但是當我運行程序Login時,程序似乎崩潰。事實上,我沒有收到任何錯誤消息,這可能會進一步說明我的問題!這可能是數據庫驅動程序問題嗎? (使用了Delphi7,與DevartSQLiteDirect司機SQLite數據庫)德爾福SQlite登錄程序崩潰

Procedure TForm1.Connection; 
begin 
SQLConnection1.Params.Add('Database=C:\SQLite\PupilDatabase'); 
    try 
    // Establish the connection. 
    SQLConnection1.Connected := true; 
    label4.Caption := 'OK!'; 
    except 
    on E: EDatabaseError do 
     ShowMessage('Exception raised with message' + E.Message); 
    end; 
end; 

Procedure TForm1.UserLogin; 
var QueryPass : string; 
    Lcount : String; 
    cont : boolean; 
begin 
cont := false; 
if InputID.Text = '' then 
ShowMessage('Invalid Pupil ID') 
else begin 
     cont := True; 
While cont = True do 
begin 
    // A random query 
    QueryPass := 'SELECT password FROM TblPupil Where pupilID = +InputID.Text+';'; 
    try 
    // Assign the query to the object SQLQuery1. 
    SQLQuery1.SQL.Text := QueryPass; 
    SQLQuery1.open; 
    except 
    on E: Exception do 
     ShowMessage('Exception raised with message: ' + E.Message); 
    end; 
SQLQuery1.First; 
Lcount := SQLQuery1.FieldValues['password']; 
if Lcount = InputPass.text then 
    begin 
    Form1.Hide; 
    Form16.show; 
    end 
else 
    begin 
    ShowMessage('Wrong'); 
    cont := false; 
    end; 
    Form1.Hide; 
    Form16.show;  
end; 
end; 
end; 
+0

調試器告訴你什麼當你通過'UserLogin'代碼? – 2015-01-31 18:00:06

+0

只有一個錯字?您的查詢是無效的。 'QueryPass:='SELECT password FROM TblPupil Where pupilID = + InputID.Text +';'這意味着'pupilID'必須等於一個帶有加號'+'和文本'InputID.Text'的字符串。我很確定這不是你想要的。正確的查詢應該如下所示:'QueryPass:='SELECT password FROM TblPupil Where pupilID ='''+ InputID.Text +''';' ;'或者如果字段pupilID是一個整數,那麼:'QueryPass:='SELECT password FROM TblPupil Where pupilID ='+ InputID.Text +';' ;' – 2015-01-31 21:38:27

回答

-2

我認爲你應該做這樣的事情(從我在一個應用程序中使用的代碼):

procedure TForm4.AdvGlowButton1Click(Sender: TObject); 
    begin 
    LOGIN_QUERY.Active:=false; 
    LOGIN_QUERY.SQL.Clear; 
    LOGIN_QUERY.SQL.Add('select user,password,from users where user='+QuotedStr(cxlookupcombobox1.text)+' and password='+QuotedStr(cxTextEdit1.Text)); 
    LOGIN_QUERY.Open; 
    if LOGIN_QUERY.FieldByName('Password').AsString<>'' 
    then Form16.Show else 
    ShowMessage('Wrong Password'); 
    end; 

雖然你的代碼是一個小挑剔,我不明白你的桌子上只包含pupilID和密碼。不應該有一個學生的名字?

+2

你能查看我最喜歡的密​​碼嗎?從用戶中刪除;'用你的應用程序? – 2015-02-01 01:24:01

+0

感謝您的回覆......我目前正在根據您的回覆重新開展解決方案。我會盡快更新進度。謝謝 – user3396486 2015-02-02 11:36:00

0

這可能是form16尚未創建的事實。然而,更重要的是,你需要讓delphi在遇到異常時停止。我懷疑你不小心把它關掉了。 取決於你的Delphi版本,它可能是 菜單/選項/調試器選項,然後選擇Stop on Delphi Exceptions。

還要注意,'第一'操作在空數據集上失敗,所以在防禦方面,如果inputid無效,您應該在那裏進行'bof'檢查。

2

您的查詢是無稽之談。因爲它現在寫了,它甚至不會編譯(你沒有在右端引用引號),更不用說執行(因爲`WHERE pupilID = + Input.Text +'是無效的SQL語法)。

擺脫在開始之前立即連接SQL並學習使用參數化查詢的習慣。這樣做可以防止SQL注入,並允許數據庫驅動程序正確地執行數據類型的轉換並在需要時正確引用值,因此您不必這樣做。

SQLQuery1.SQL.Text := 'SELECT password from TblPupil'#13 + 
         'WHERE pupilID = :pupilID'; 
SQLQuery1.ParamByName('pupilID').AsString := InputID.Text; 
SQLQuery1.Open; 

有了這樣說,代碼在你UserLogin過程中的其餘部分是相當糟糕,以及。它混雜着不必要的變量,它具有無效的邏輯(無論用戶名和密碼是否匹配,最終隱藏Form1並顯示Form6,這會破壞登錄的全部目的,AFAICT)。您可以嘗試這樣的代碼:

Procedure TForm1.UserLogin; 
var 
    UserPass: string; 
begin 
    if InputID.Text = '' then 
    raise Exception.Create('You must enter a Pupil ID.'); 

    SQLQuery1.SQL.Text := 'SELECT password from TblPupil'#13 + 
         'WHERE pupilID = :pupilID'; 
    SQLQuery1.ParamByName('pupilID').AsString := InputID.Text; 
    try 
    SQLQuery1.Open; 
    if SQLQuery1.IsEmpty then 
     raise Exception.Create('Invalid Pupil ID or password.'); 
    UserPass := SQLQuery1.FieldValues['password']; 
    finally 
    SQLQuery1.Close; 
    end; 

if UserPass = InputPass.text then 
begin 
    Form1.Hide; 
    Form16.show; 
    end 
    else 
    raise Exception.Create('Invalid Pupil ID or password.'); 
end;