gpt4 book ai didi

delphi - 使用查询组件“无法将类型(Null)的变体转换为类型(OleStr)”,以提取数据供以后使用

转载 作者:行者123 更新时间:2023-12-03 19:24:10 24 4
gpt4 key购买 nike

我正在尝试使用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分配列中的值,但是所有发生的是弹出错误。

到目前为止,这只发生在那条线上。

最佳答案

问题

显然,此字段返回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']);

关于delphi - 使用查询组件“无法将类型(Null)的变体转换为类型(OleStr)”,以提取数据供以后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56129684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com