2

我在将新的 QSqlRecord 插入 Postgresql 数据库时遇到问题。目标表定义如下:

create table samochod(
  samochod_id integer primary key default nextval('samochod_id_seq'),
  marka varchar(30),
  poj_silnika numeric,
  typ_silnika silnik_typ,
  liczba_osob smallint
);

记录插入代码为:

  QSqlRecord rec = model->record();

  rec.setGenerated("samochod_id", false);
  rec.setValue("marka", ui.brandEdit->text());
  rec.setValue("poj_silnika", ui.volSpin->value());
  rec.setValue("typ_silnika", ui.engineCombo->currentText());
  rec.setValue("liczba_osob", ui.passengersSpin->value());

  bool ok = model->insertRecord(-1,rec);

我想要做的就是插入一条新记录,并让 sqlsamochod_id为我设置它,但尽管我设置isGenerated为 false,但它会因消息而崩溃:

"ERROR:  null value in column "samochod_id" violates not-null constraint
QPSQL: Unable to create query"

我应该怎么做才能使 QSqlRecord 离开samochod_id数据库的生成?

4

5 回答 5

2

我找到了一个奇怪的解决方案来解决这个问题。线:

rec.setGenerated("samochod_id", false);

上面的 int 方法似乎没有效果,但是当我将它移到模型的信号处理程序时,它开始按预期工作:

CarsModel::CarsModel(QObject * parent, QSqlDatabase db)
  : SqlModel(parent, db, "samochod")
{
  engineTypes << "Diesel" << "Na gaz" << "Benzynowy" << "Elektryczny";

  connect(this, SIGNAL(beforeInsert(QSqlRecord &)), this,
      SLOT(beforeInsertRec(QSqlRecord &)));
}


void CarsModel::beforeInsertRec(QSqlRecord & rec){
  rec.setGenerated(0, false);
}
于 2012-04-13T21:16:43.957 回答
2

您可以使用removeColumn(int)之前QSqlRecord rec = model->record(),它应该工作。如果model关联到一个视图(例如 QTableView 实例),那么您将有效地隐藏该samochod_id列。

试试这个:

  // get the index of the id column
  int colId = model.fieldIndex("samochod_id");
  // remove the column from the model
  model.removeColumn(colId);

  QSqlRecord rec = model->record();

  // rec.setGenerated("samochod_id", false); /// not needed anymore
  rec.setValue("marka", ui.brandEdit->text());
  rec.setValue("poj_silnika", ui.volSpin->value());
  rec.setValue("typ_silnika", ui.engineCombo->currentText());
  rec.setValue("liczba_osob", ui.passengersSpin->value());

  bool ok = model->insertRecord(-1,rec);

我能理解你为什么更喜欢以这种方式插入记录(避免手动编写 SQL)。QSqlTableModel我认为仅出于插入记录的目的使用实例太昂贵(模型是复杂的野兽),所以我更喜欢使用普通的QSqlQuery. 使用这种方法,QSqlTableModel如果您需要在事务中的多个表中插入记录,则无需实例化多个 s,一个QSqlQuery就足够了:

  QSqlDatabase::database("defaultdb").transaction();
  QSqlQuery query(QSqlDatabase::database("defaultdb"));

  query.prepare(QString("INSERT INTO table1 (field1, field2) VALUES(?,?)"));
  query.bindValue(0,aString);
  query.bindValue(1,anotherString);
  query.exec();

  // insert in another table
  query.exec(QString("INSERT INTO table2 (field1, field2) VALUES(...)");

  bool ok = QSqlDatabase::database("defaultdb").commit();
  query.finish();

  if(!ok){
      // do something
  }
于 2012-04-14T19:19:03.410 回答
0
于 2012-04-13T20:03:28.183 回答
0

这是自 Qt 4.8 以来的一个已知错误:

https://bugreports.qt-project.org/browse/QTBUG-23592

于 2012-07-10T19:06:19.400 回答
0

这是 Qt 的一个已知错误。在 Qt 5 中修复。

于 2014-02-01T18:55:02.767 回答