«Не удалось преобразовать переменную типа (Null) в тип (OleStr)» с использованием компонента запроса для извлечения данных для последующего использования - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь извлечь данные из таблицы «Игры», используя qry1, в строковую переменную, чтобы потом вставить ее в «Библиотеку». Моя проблема в том, что когда я нажимаю на кнопку, это дает мне вышеупомянутую ошибку в строке 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 Ответ

4 голосов
/ 14 мая 2019

Проблема

Очевидно, это поле возвращает null, указывая, в общем, что оно пустое.

Вариант со значением null не может быть назначенСтрока, как это.Небольшой код, который воспроизводит проблему без каких-либо запросов, будет выглядеть так:

var
  s: String;
  v: Variant;
begin
  v := null;
  s := v;
  ShowMessage(s);

Обратите внимание, что некоторые базы данных (в частности, Oracle) не различают пустые строки и нуль, поэтому, если вы вставитепустая строка, вы получите ноль обратно, потому что для них это то же самое.

И довольно странно, что GameName пусто, так как вы использовали его в предложении where.Вероятно, это связано с тем, что игра не найдена и ваш запрос не вернул ни одной строки.Проверьте qry1.IsEmpty, чтобы проверить, действительно ли вы получили результат перед выполнением остальной части кода.Возможно, это уже решило бы вашу проблему ...

Решения

Итак, если вы проверили, действительно ли запрос вернул строку, но некоторые поля на самом деле равны нулю, и выЧтобы справиться с этим, есть два взаимозаменяемых способа сделать это:

Использовать метод AsString для этого поля.Для этого вам нужно использовать метод FieldByName для получения объекта поля, а не его вариантное значение:

sGameName := qry1.FieldByName('GameName').AsString;

или использовать функцию VarToStr.Эффект тот же, и я думаю, что это более или менее то, что AsString делает в любом случае.Какой из них использовать, это вопрос личных предпочтений.

sGameName := VarToStr(qry1['GameName']);
...