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

时间:2014-08-20 15:23:15

标签: sql database delphi

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

[解决]

谢谢大家对我的建议!

1 个答案:

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