【发布时间】:2014-08-20 15:23:15
【问题描述】:
我正在尝试使用 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
[已解决]
感谢大家的建议,我让它工作了!
【问题讨论】:
-
使用参数化查询!这就是他们的目的。作为替代使用单引号。
-
Uwe Raabe 所说的。但请在您的代码中准确显示错误发生的位置。
-
我更改了我的主要帖子以显示错误发生的位置
-
确保在读取任何值之前检查 BOF/EOF,并在比较值之前检查 NULL 值。但是,当查询已经为您进行了比较时,您为什么还要手动比较用户名呢?为什么不把密码也放在查询中呢?您还应该考虑使用
COUNT()而不是*,除非您计划从找到的记录中读取其他值。查询您不会使用的值是一种浪费。 -
我不知道
Query是哪个组件类型,但您可能想试试:Query.FieldByName('Username').AsString。这将消除 NULL 问题。在实际测试字段之前检查Query.IsEmpty也是一个好主意。