2013-09-29 125 views
-4

嗨我有一個德爾福7項目任務,我們需要包括一個登錄系統。我有一個註冊頁面,數據發送到Access中的表格。現在,當用戶需要登錄時,需要檢查他/她的信息是否存在,然後他將被授予進一步的權限,但不知道如何執行此操作。如何通過Delphi檢查MS Access(數據庫)中是否存在記錄?

+3

先試,然後問。一路上至少必須有*你已經想出的東西。 – Sumurai8

+1

當然,你可以搜索如何使用Delphi和ADO與Access,並且至少拿出*某種*努力來自己做這件事。谷歌'delphi數據庫教程',至少。 –

回答

1

以來,它一直我升級到2005年的一段時間,所以我無法測試它的德爾福7,但在2005年德爾福和至少,你可以使用以下過程:

USES {$IFDEF UseParmsEvenThoughTheyAreNotNecessary } DB {$ELSE } StrUtils {$ENDIF } ,ADODB; 

FUNCTION CanLogIn(CONST UserName,Password : STRING ; CONST AccessDatabaseFile,TableName,UserField,PasswordField : STRING) : BOOLEAN; 
    VAR 
    Connection : TADOConnection; 
    DataSet : TADODataSet; 

    FUNCTION AccessConnStr(CONST FileName : STRING) : STRING; 
    BEGIN 
     {$IFDEF CPUX64 } 
     Result:='Provider=Microsoft.ACE.OLEDB.12.0;Data source='+FileName 
     {$ELSE } 
     Result:='Provider=Microsoft.Jet.OLEDB.4.0.0;Data Source='+FileName 
     {$ENDIF } 
    END; 

    {$IFNDEF UseParmsEvenThoughTheyAreNotNecessary } 
    FUNCTION QuotedStr(CONST STR : STRING) : STRING; 
     BEGIN 
     Result:=''''+ReplaceStr(STR,'''','''''')+'''' 
     END; 
    {$ENDIF } 

    BEGIN 
    Connection:=TADOConnection.Create(NIL); 
    TRY 
     Connection.ConnectionString:=AccessConnStr(AccessDatabaseFile); 
     TRY 
     Connection.Connected:=TRUE; 
     TRY 
      DataSet:=TADODataSet.Create(NIL); 
      TRY 
      DataSet.CommandType:=cmdText; 
      {$IFDEF UseParmsEvenThoughTheyAreNotNecessary } 
       DataSet.ParamCheck:=TRUE; 
       DataSet.Parameters.CreateParameter('UserName',ftString,pdInput,80,UserName); 
       DataSet.Parameters.CreateParameter('Password',ftString,pdInput,80,Password); 
       DataSet.CommandText:='SELECT * FROM ['+TableName+'] WHERE ['+UserField+']=:UserName AND ['+PasswordField+']=:Password'; 
      {$ELSE } 
       DataSet.ParamCheck:=FALSE; 
       DataSet.CommandText:='SELECT * FROM ['+TableName+'] WHERE ['+UserField+']='+QuotedStr(UserName)+' AND ['+PasswordField+']='+QuotedStr(Password); 
      {$ENDIF } 
      TRY 
       DataSet.Open; 
       TRY 
       Result:=NOT DataSet.EOF 
       FINALLY 
       DataSet.Close 
       END 
      EXCEPT 
       Result:=FALSE 
      END 
      FINALLY 
      DataSet.Free 
      END 
     FINALLY 
      Connection.Close 
     END 
     EXCEPT 
     Result:=FALSE 
     END 
    FINALLY 
     Connection.Free 
    END 
    END; 

參數:

UserName = Name of the user attempting to log in 
Password = Password of the user 
AccessDatabaseFile = The access database file 
TableName = The name of the table containing the UserName/Password for allowed users 
UserField = The name of the field in the above table that contains the user name 
PasswordField = The name of the field in the above table that contains the password for the user 

如果發生異常(找不到文件,錯誤的表名/字段名或你有什麼),該功能捕捉這些並返回FALSE。只有當整個函數成功並且用正確的密碼在表中找到用戶時,該函數是否返回TRUE。

+2

即使這樣做,使用參數總是正確的做法。作爲額外的獎勵,你不必做QuotedStr混亂! (FYI QuotedStr是Delphi中的一個函數) – whosrdaddy

+0

「Right」由誰的定義?當然不是我的。如果不僅「會是這樣」(從SQL注入安全) - 是IS。我之前對人們提出過挑戰,他們從來沒有能夠用這種類型的SQL語句構建來進行SQL注入。你可以嗎? :-) – HeartWare

+0

請參閱http://www.sqlinjectionwiki.com/Categories.aspx?catId=6和http://www.securityfocus.com/archive/1/511061/30/8400/threaded,瞭解您的代碼爲什麼是失敗。 – Johan

相關問題