我正在尝试使用SQL检查数据库(Access)中是否存在特定用户名。如果我只使用字母或字符串字符代码工作正常,但当我使用数字时,如下面的示例,即使我将它们作为字符串插入我得到错误:
"无法将类型(Null)的变体转换为类型(OleStr)"
DataModule.Query.Active := False;
sQuery := 'SELECT * FROM Login WHERE Username = "31"';
DataModule.Query.SQL.Text := sQuery;
DataModule.Query.Active := True;
我不知道我做错了什么。
编辑:
调试器在以下代码中的if行之后提供错误
if UpperCase(DataModule.Query['Username']) = sUsername then
begin
if DataModule.Query['Password'] = sPassword then
begin
bPass := True;
end
[解决]
谢谢大家对我的建议!
答案 0 :(得分:4)
您应该使用Query.FieldByName('Password').AsString
(用户名字段相同)来消除任何NULL问题。 .AsString
会将db NULL转换为Delphi空字符串''
。
打开查询后,您需要在实际测试用户名/密码逻辑之前测试是否有任何记录。
注意:您不需要再次检查用户名,因为如果查询返回结果,则匹配并且该用户存在于您的表中:
bPass := False;
if not DataModule.Query.IsEmpty then
if DataModule.Query.FieldByName('Password').AsString = sPassword then
begin
bPass := True;
end
如前所述,您最好使用参数化查询。或者至少使用QuotedStr
来避免SQL注入。 e.g:
sQuery := 'SELECT * FROM Login WHERE Username = ' + QuotedStr('31');
参数化查询应如下所示:
sQuery := 'SELECT * FROM Login WHERE Username = :Username';
DataModule.Query.SQL.Text := sQuery;
DataModule.Query.ParamByName('Username').Value := '31';