2015-01-31 126 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;