我使用Delphi XE3并使用带有DB express的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 :(得分:1)
您也不需要使用RecordCount(您指示错误发生的地方)。请改用TDataSet.IsEmpty。
此外,来自documentation(强调我的):
Params是TParam对象的集合,表示由SQL数据集指定的查询或存储过程的参数。 通过设置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;