"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']);