一直试图弄清楚为什么以下登录验证程序不起作用。我有一个简单的数据库表,其中包含pupilID和密码(在tblPupil中)它似乎在编译时连接正常,即程序连接,但是当我运行程序登录时......程序似乎崩溃了。事实上,我没有得到任何可以进一步说明我的错误消息!这可能是数据库驱动程序问题吗? (使用Delphi7,带有DevartSQLiteDirect驱动程序的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 :(得分:2)
您的查询是无稽之谈。正如它现在编写的那样,它甚至不会编译(你在右边有未终止的引号),更不用说执行了(因为`WHERE pupilID = + Input.Text +'是无效的SQL语法)。 / p>
在您开始之前,立即摆脱连接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;
答案 1 :(得分:0)
可能还没有创建form16。但是,更重要的是,你需要让delphi在遇到异常时停止。我怀疑你不小心把它关了。 根据您的Delphi版本,可能会有所不同 menu / Options / Debugger Options然后选择Stop on Delphi Exceptions。
另请注意,“第一个”操作在空数据集上失败,所以在防御性的情况下,如果inputid无效,您应该在那里进行'bof'检查。
答案 2 :(得分:-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和密码的。难道不应该有学生名字吗?