我正尝试使用qry1从表“ Games”中提取数据到字符串变量中,然后再将其插入“ Library”中。我的问题是,当我单击按钮时,它在sGameName := qry1['GameName'];
行上给了我上述错误。该字段是一个短字符串变量
procedure TForm1.btnConfirmClick(Sender: TObject);
var
sGameID, sGameName, sPlatform : string;
begin
if (chkAddLb.Checked = True) and (chkRemoveLb.Checked = False) then
begin
qry1.Close;
qry1.SQL.Text := 'SELECT * FROM Games WHERE GameName = "' + cbb1.Items.Text + '";';
qry1.Open;
qry1.First;
sGameID := qry1['GameID'];
sGameName := qry1['GameName'];
sPlatform := qry1['Platform'];
qry1.Close;
qry1.SQL.Text := 'INSERT INTO Library ([GameName],[GameID],[Platform],[UserID]) VALUES ("' + sGameName + '","' + sGameID + '","' + sPlatform + '","' + sLoggedInUser + '");';
qry1.ExecSQL;
qry1.SQL.Text := 'SELECT * FROM Library WHERE UserID = "' + sLoggedInUser + '";';
qry1.Open;
end;
我希望变量sGameName
被赋予该列中的值,但所有发生的就是弹出错误。
目前为止仅在该行发生。
答案 0 :(得分:4)
问题
显然,此字段返回null
,通常表明它为空。
不能将值null
的变体分配给这样的字符串。一个小的代码可以重现该问题,而根本不涉及查询,如下所示:
var
s: String;
v: Variant;
begin
v := null;
s := v;
ShowMessage(s);
请注意,某些数据库(尤其是Oracle)不会区分空字符串和null,因此,如果插入空字符串,则会返回null,因为它们是相同的。
GameName
为空非常奇怪,因为您在where
子句中使用了它。这可能是因为找不到游戏,并且您的查询未返回任何行。在执行其余代码之前,请检查qry1.IsEmpty
以检查是否确实得到了结果。那可能已经解决了您的问题...
解决方案
因此,如果您检查查询是否确实返回了一行,但是某些字段实际上为空,并且您需要处理该问题,则有两种可互换的方法可以做到这一点:
使用字段的AsString
方法。为此,您需要使用FieldByName方法来获取字段对象,而不是它的变量值:
sGameName := qry1.FieldByName('GameName').AsString;
或使用VarToStr
函数。效果是一样的,我认为这或多或少是AsString所做的。使用哪个是个人喜好问题。
sGameName := VarToStr(qry1['GameName']);