"Could not convert varient of type (Null) into type (OleStr)" 使用查询组件提取数据供以后使用
"Could not convert varient of type (Null) into type (OleStr)" using a query component to extract data for later usage
我正在尝试使用 qry1 从 table "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
被赋予列中的值,但是发生的只是弹出错误。
到目前为止,这只发生在该行上。
问题
显然这个字段returns null
,一般表示它是空的。
值 null
的变体不能分配给这样的字符串。重现问题而不涉及查询的小代码如下所示:
var
s: String;
v: Variant;
begin
v := null;
s := v;
ShowMessage(s);
请注意,某些数据库(尤其是 Oracle)不区分空字符串和 null,因此如果您插入一个空字符串,您将返回 null,因为对它们来说是一样的。
GameName
是空的,这很奇怪,因为您在 where
子句中使用了它。这可能是因为未找到该游戏并且您的查询没有 return 任何行。检查 qry1.IsEmpty
以检查您是否在执行其余代码之前确实得到了结果。那可能已经解决了您的问题...
解决方案
因此,如果您检查查询是否确实 return 了一行,但某些字段实际上为空并且您需要处理它,有两种可互换的方法可以做到这一点:
使用字段的AsString
方法。为此,您需要使用 FieldByName 方法来获取字段对象,而不是它的变量值:
sGameName := qry1.FieldByName('GameName').AsString;
或使用VarToStr
功能。效果是一样的,我认为这或多或少是 AsString 正在做的事情。使用哪一个是个人喜好问题。
sGameName := VarToStr(qry1['GameName']);
我正在尝试使用 qry1 从 table "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
被赋予列中的值,但是发生的只是弹出错误。
到目前为止,这只发生在该行上。
问题
显然这个字段returns null
,一般表示它是空的。
值 null
的变体不能分配给这样的字符串。重现问题而不涉及查询的小代码如下所示:
var
s: String;
v: Variant;
begin
v := null;
s := v;
ShowMessage(s);
请注意,某些数据库(尤其是 Oracle)不区分空字符串和 null,因此如果您插入一个空字符串,您将返回 null,因为对它们来说是一样的。
GameName
是空的,这很奇怪,因为您在 where
子句中使用了它。这可能是因为未找到该游戏并且您的查询没有 return 任何行。检查 qry1.IsEmpty
以检查您是否在执行其余代码之前确实得到了结果。那可能已经解决了您的问题...
解决方案
因此,如果您检查查询是否确实 return 了一行,但某些字段实际上为空并且您需要处理它,有两种可互换的方法可以做到这一点:
使用字段的AsString
方法。为此,您需要使用 FieldByName 方法来获取字段对象,而不是它的变量值:
sGameName := qry1.FieldByName('GameName').AsString;
或使用VarToStr
功能。效果是一样的,我认为这或多或少是 AsString 正在做的事情。使用哪一个是个人喜好问题。
sGameName := VarToStr(qry1['GameName']);