Как вставить целочисленное значение в таблицу SQLite в Delphi

Я пытаюсь вставить целочисленное значение в свою таблицу SQLite в Delphi.
В таблице emp usergroup_id является целым числом, а label, description — строковым типом данных.
Мой код выглядит следующим образом:

var
  gid: Integer;
  sdescription,ldescription: String;
begin
  sdescription := RzEdit1.Text;
  ldescription := RzMemo1.Text;
  gid := Integer(RzComboBox1.Items.Objects[RzComboBox1.Items.IndexOf(gname)]);

  try
    SQLConnection1.Connected := true;
    SQLMonitor1.Active := True;
    sSql := 'INSERT INTO emp(usergroup_id, label, description) VALUES (gid,''' + sdescription + ''',''' + ldescription + ''' )';
    SQLConnection1.ExecuteDirect(sSql);

  except
    on E: EDatabaseError do
      ShowMessage('Exception raised with message' + E.Message);
  end;
end;

Это дает мне ошибку как Unknown column gid.
Когда я попробовал что-то подобное с фиксированным целочисленным значением вместо переменной, это работает:

sSql := 'INSERT INTO emp(usergroup_id, label, description) VALUES (1,''' + sdescription + ''',''' + ldescription + ''' )';

Он успешно вставляет значения в таблицу.
Как вставить целочисленное значение gid в базу данных с помощью вышеуказанного запроса. Какой формат будет правильным?


person Ninad Avasare    schedule 07.10.2013    source источник


Ответы (1)


Ваш gid становится частью оператора SQL (отсюда и ошибка: Unknown column gid).
Вам нужно использовать переменную Delphi gid для создания оператора SQL (точно так же, как вы делали с sdescription и ldescription):

sSql := 'INSERT INTO emp(usergroup_id, label, description) VALUES (' + InttoStr(gid) + ', ''' + sdescription + ''',''' + ldescription + ''' )';

Если бы вы использовали Параметры, у вас не было бы такого беспорядочного запроса/кода (который также подвергается внедрению SQL и т. д.), например:

qry := TSQLQuery.Create(nil); // or what ever TQuery component you use in your framework
try
  qry.SQLConnection := SQLConnection1;
  qry.SQL.Text := 'INSERT INTO emp(usergroup_id, label, description) VALUES (:usergroup_id, :label, :description)';
  qry.Params.ParamByName('usergroup_id').Value := gid;
  qry.Params.ParamByName('label').Value := sdescription;
  qry.Params.ParamByName('description').Value := ldescription;
  qry.ExecSQL;
finally
  qry.Free;
end;
person kobik    schedule 07.10.2013
comment
Бонусный код и подробный ответ помогли, однако возникла ошибка, например, параметр usergroup_id не найден, то же самое с меткой и описанием. Я использую TSQLQuery потомка TQuery и измененный код следующим образом qry.Params.ParamByName('usergroup_id').Value := gid; - person Ninad Avasare; 07.10.2013
comment
Как всегда +1 за параметры ;) - person whosrdaddy; 07.10.2013