QT - 写入SQL数据库时,空QLineEdits未作为NULL传递

时间:2017-12-12 23:18:46

标签: c++ sql-server qt

我对QT和C ++比较陌生,我正试图为数据库制作一个基本的前端。

我遇到了一个障碍,其中QlineEdits留空或空白将空数据写入数据库。我的意思是,如果我select * where 'column'is NULL,我没有结果。但是,如果我select * where 'column' = '',那么我将获得所有empty行。

有没有办法改变这种行为?或者将它们写成NULL?我担心这对于我希望数据库将QlineEdit数据存储为整数的字段也会造成严重破坏,但它会尝试在空白处写入。
我可以预先设置QlineEdits0,即

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

1 个答案:

答案 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文档。

http://doc.qt.io/qt-5/qsqlquery.html#bindValue