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

时间:2019-05-14 11:45:12

标签: delphi variables variable-assignment

我正尝试使用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被赋予该列中的值,但所有发生的就是弹出错误。

目前为止仅在该行发生。

1 个答案:

答案 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']);
相关问题