2017-12-12 11 views
1

QTやC++には比較的新しく、データベースの基本的なフロントエンドを作成しようとしています。QT - 空のQlineditがSQLデータベースに書き込むときにNULLとして渡されない

Qlineeditsが空白または空白になっていると、空のデータがデータベースに書き込まれます。つまり、「column」がNULLの場所を選択した場合、結果は得られません。しかし、もし私が* 'column' = ''を選択すると、すべての空の行が得られます。

この動作を変更する方法はありますか?または、それらをNULLとして書かせるか? Qlineeditのデータを整数として格納するデータベースでは空白を書き込もうとしているフィールドでは、それが混乱の原因になるのではないかと心配しています。 Qlineditsを '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

はい、あなたは.... NULLなどの値を挿入するための

使用プレースホルダをそれらを書き、NULLを追加する機能の下に使用してヌルQVariantを渡すことができます。

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

は、今すぐあなたのinsert文のプレースホルダとしてBankMonth、BusManagerとCustFirstNameを持っています。

次に、以下のように値をホルダーにバインドします。

三元演算子を使用するか、これまでに便利なものを使用します。 テキストが空であるかどうかを確認し、そうであれば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

+0

ありがとうございました。本当に助かりました。また、 "int integer_value = ui-> lineEdit-> text()。toInt();"のようなものを使って、整数をデータベースに渡すべきですか?代わりにテキストとして? – FrostK

+0

することができます.... QVariantはほとんどすべての種類のオーバーロードを持っています.... – Naidu

+0

上記のコードを使用していくつかの異なることを試してきましたが、NULLだけがデータベースに渡されますか? – FrostK

関連する問題