2014-02-28 36 views
1

我使用Delphi XE3並使用SQLite數據庫和DB express。Delphi + SQLite +數據庫快速選擇帶參數錯誤

這是我user validation代碼:

function validateUser(UserName, Password: string): Boolean; 
var 
    AParams: TParams; 
    SQLTxt: string; 
    MD5 : TIdHashMessageDigest5; 
    RecCount: integer; 
begin 
    AParams := TParams.Create(nil); 
    MD5 := TIdHashMessageDigest5.Create; 
    try 
    Result := False; 
    AParams.CreateParam(ftString, 'username', ptInput).Value := UserName; 
    AParams.CreateParam(ftString, 'password', ptInput).Value := 
     MD5.HashBytesAsHex(MD5.HashString(Password)); 
    SQLTxt := 'SELECT login_id FROM login WHERE '+ 
    'login_username = :username AND login_password = :password ;'; 
    with Form1.sqlqry1 do 
    begin 
     SQL.Clear; 
     SQL.Text := SQLTxt; 
     Params := AParams; 
     //Params.Items[0].Value := AParams.Items[0].Value; 
     //Params.Items[1].Value := AParams.Items[1].Value; 
     Prepared := true; 
     Open; 
    end; 
    RecCount := Form1.sqlqry1.RecordCount;// I have error here 
    if RecCount = 0 then 
     Result := False 
    else 
     Result := True; 
    // end 
    finally 
    AParams.Free; 
    MD5.Free; 
    end; 
end; 

應用告訴我[0x0005]: Operation Not Supported錯誤。

什麼問題?爲什麼?

+0

這是[已知問題](http://edn.embarcadero.com/article/28494)。我會通過執行'SELECT COUNT(*)FROM ...'查詢並從字段中獲取值來解決此問題。 – TLama

+0

@TLama:不適用於COUNT(*); –

+0

它應該。 SQLite支持'COUNT'函數,所以如果你執行這樣的查詢,你應該從第一個字段'SQLQuery1.Fields [0] .AsInteger'獲得計數。這將是替換有問題的'RecordCount'屬性。 – TLama

回答

1

你也不需要使用RecordCount(這是你指出錯誤發生的地方)。改爲使用TDataSet.IsEmpty

此外,從documentation強調礦):

params是一個代表查詢或由SQL數據集指定的存儲過程的參數TParam對象的集合。 當通過設置CommandText屬性(或TSQLQuery中的SQL屬性)指定查詢時,SQL數據集將自動分析查詢併爲查詢中的每個參數填充帶有TParam對象的Params。

您不需要手動創建參數;數據集將自動爲您分配SQL。

function validateUser(UserName, Password: string): Boolean; 
var 
    SQLTxt: string; 
    MD5 : TIdHashMessageDigest5; 
    RecCount: integer; 
begin 
    MD5 := TIdHashMessageDigest5.Create; 
    try 
    Result := False; 
    SQLTxt := 'SELECT login_id FROM login WHERE '+ 
    'login_username = :username AND login_password = :password ;'; 
    with Form1 do 
    begin 
     // Clear not needed when setting SQL.Text directly. 
     sqlqry1.SQL.Text := SQLTxt; 
     sqlqry1.Params.ParamByName('username').AsString := UserName; 
     sqlqry1.Params.ParamByName('password').AsString := 
       MD5.HashBytesAsHex(MD5.HashString(Password)); 

     sqlqry1.Open; 
     Result := not sqlqry1.IsEmpty; 
    end; 
    finally 
    MD5.Free; 
    end; 
end; 
+0

這總是返回false,即使用戶名和密碼爲真。 –

+0

恩,不,不。如果查詢結果沒有行,則「IsEmpty」返回True; 'not'表示「如果查詢不爲空,則將結果設置爲True」。 「not false」=「true」。這是'sqlQry1.IsEmpty <> False then'Result'= True;'的簡寫方式。 –

+0

此查詢永遠是空的,我的問題在這裏。 –