簡體   English   中英

QSqlRecord將查詢中具有默認值的列設置為null

[英]QSqlRecord sets column with default value to null in query

我在將新的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);

所有我想要做的是插入一個新的記錄,並進行SQL設置其samochod_id我,但,盡管我設置isGenerated為false它崩潰的消息:

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

我應該怎么做才能讓QSqlRecord離開一代samochod_id數據庫?

我找到了解決這個問題的怪異方法。 線:

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);
}

您可以在QSqlRecord rec = model->record()之前使用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 ,一個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
  }

我沒有使用Qt的經驗,但是我建議samochod_id列完全不設置任何值。

SQL級別上,可能看起來像這樣:

INSERT INTO samochod (marka, poj_silnika, poj_silnika, liczba_osob)
     VALUES (...);

如您所見,我只是“忽略”了 samochod_id列,讓PostgreSQL使用默認值。

自Qt 4.8起,這是一個已知的錯誤:

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

這是Qt的已知錯誤。 已在Qt 5中修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM