我对QT和C ++比较陌生,我正试图为数据库制作一个基本的前端。
我遇到了一个障碍,其中QlineEdits
留空或空白将空数据写入数据库。我的意思是,如果我select * where 'column'is NULL
,我没有结果。但是,如果我select * where 'column' = ''
,那么我将获得所有empty
行。
有没有办法改变这种行为?或者将它们写成NULL?我担心这对于我希望数据库将QlineEdit
数据存储为整数的字段也会造成严重破坏,但它会尝试在空白处写入。
我可以预先设置QlineEdits
到0
,即
ui->txt_NAF->setText();
但这不会消除人为错误。
任何人都有解决此问题的方法吗?
用于插入数据库(SQL服务器)的QT代码片段;
void log::on_pushButton_clicked() /* this is my save button */
{
MainWindow conn;
QString BANK_MNTH, BUSN_MNGR, CUST_FRST_NAME, CUST_LAST_NAME, DEAL_NUMB ,COST;
BANK_MNTH=ui->txt_BANK_MNTH->text();
BUSN_MNGR=ui->txt_BUSN_MNGR->text();
CUST_FRST_NAME=ui->txt_CUST_FRST_NAME->text();
CUST_LAST_NAME=ui->txt_CUST_LAST_NAME->text();
DEAL_NUMB=ui->txt_DEAL_NUMB->text();
COST=ui->txt_NAF->text();
if(!conn.connOpen()){
qDebug()<<"Failed to open database";
return;
}
conn.connOpen();
QSqlQuery qry;
qry.prepare("insert into LOG (BANK_MNTH, BUSN_MNGR, CUST_FRST_NAME, CUST_LAST_NAME, DEAL_NUMB ,COST) values ('"+BANK_MNTH +"','"+BUSN_MNGR+"','"+CUST_FRST_NAME+"','"+CUST_LAST_NAME+"','"+DEAL_NUMB+"','"+COST+"')");
if(qry.exec( ))
{
QMessageBox::critical(this,tr("Save"),tr("Record Saved"));
QSqlQueryModel * modal=new QSqlQueryModel();
QSqlQuery* qry2=new QSqlQuery(conn.mydb);
qry2->prepare("select DEAL_NUMB, BUSN_MNGR, CUST_FRST_NAME, CUST_LAST_NAME, COST from LOG order by DEAL_NUMB DESC");
qry2->exec();
modal->setQuery(*qry2);
ui->tableView->setModel(modal);
ui->tableView->resizeColumnsToContents();
ui->tableView->setAlternatingRowColors(true);
conn.connClose();
foreach(QLineEdit *log, this->findChildren<QLineEdit*>()) {
log->clear();
}
}
else
{
QMessageBox::critical(this,tr("Error"),qry.lastError().text());
}
}
答案 0 :(得分:1)
是的,您可以将它们写为NULL ....
使用占位符插入值,并使用以下函数传递空QVariant
以添加NULL。
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
您的代码可能看起来像这样......(您的想法中的变量很少......)
使用占位符为insert
撰写准备声明。
query.prepare("INSERT INTO LOG (BANK_MNTH, BUSN_MNGR, CUST_FRST_NAME) "
"VALUES (:BankMonth, :BusManager, :CustFirstName)");
现在您将BankMonth,BusManager和CustFirstName作为insert
声明的占位符。
现在将值绑定到占位符,如下所示。
使用三元运算符或方便您的方式。
检查文本是否为空,如果是,则将QVariant(QVariant::String)
传递给NULL,否则传递文本。
//Some rough code (Not compiled and tested)
BANK_MNTH=ui->txt_BANK_MNTH->text();
BUSN_MNGR=ui->txt_BUSN_MNGR->text();
CUST_FRST_NAME=ui->txt_CUST_FRST_NAME->text();
query.bindValue(":BankMonth", BANK_MNTH.trimmed().isEmpty() ? QVariant(QVariant::String): BANK_MNTH);
query.bindValue(":BusManager", BUSN_MNGR.trimmed().isEmpty() ? QVariant(QVariant::String): BUSN_MNGR);
query.bindValue(":CustFirstName", CUST_FRST_NAME.trimmed().isEmpty() ? QVariant(QVariant::String): CUST_FRST_NAME);
参考bindValue
文档。