gpt4 book ai didi

c++ - QSqlRecord 在查询中将具有默认值的列设置为空

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:25 24 4
gpt4 key购买 nike

我在将新的 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 的生成留给数据库?

最佳答案

您可以在 QSqlRecord rec = model->record() 之前使用 removeColumn(int),它应该可以工作。如果 model 关联到 View (例如 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
}

关于c++ - QSqlRecord 在查询中将具有默认值的列设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com