Delphi SQlite登录程序崩溃

时间:2015-01-31 17:52:35

标签: sqlite delphi

一直试图弄清楚为什么以下登录验证程序不起作用。我有一个简单的数据库表,其中包含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;

3 个答案:

答案 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和密码的。难道不应该有学生名字吗?