delphi 在SQL查询中使用数字时,“无法将类型(Null)的变量转换为类型(OleStr)”

cgyqldqp  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(299)

我正在尝试使用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

[已解决]
谢谢你们所有人的建议,我让它工作了!

smtd7mpg

smtd7mpg1#

您应该使用Query.FieldByName('Password').AsString(与Username字段相同)来消除任何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注入。例如:

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';

相关问题