簡體   English   中英

QT-空的QLineEdits寫入SQL數據庫時未作為NULL傳遞

[英]QT - empty QLineEdits not being passed as NULL when writing to SQL database

我是QT和C ++的新手,正在嘗試為數據庫做一個基本的前端。

我遇到了一個障礙,其中QlineEdits保留為空或空白,將空數據寫入數據庫。 我的意思是,如果我select * where 'column'is NULL ,則不會得到任何結果。 但是,如果我select * where 'column' = ''那么我將得到所有empty行。

有什么辦法可以改變這種行為? 還是將它們寫為NULL? 我擔心這也會對我希望數據庫將QlineEdit數據存儲為整數的字段造成嚴重破壞,但它會嘗試在空白區域寫入。
我可以將QlineEdits0

ui->txt_NAF->setText();

但這不會消除人為錯誤。

有人對此問題有解決方案嗎?

下面的用於插入數據庫(SQL Server)的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());
}
}

是的,您可以將它們寫為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

暫無
暫無

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

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