2014-02-28 34 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

此查询永远是空的,我的问题在这里。 –