में C++ चर का उपयोग करें मेरा प्रोजेक्ट एक साधारण ShopApp प्रोग्राम करना है। एक समारोह जांच के बारे में है, चाहे पर्याप्त स्टॉक शेष है, ताकि कोई भी ग्राहक वांछित राशि खरीद सके जो वह खरीदना चाहता है। कार्यों लगता है कि (जहां cart
एक std::vector<product>
है और पीआईडी उत्पाद आईडी के लिए खड़ा है):क्यूटी: परिवर्तनीय में SQL-query का परिणाम सहेजें, SQL-query
bool sqlfunctions::checkStock(){
QSqlQuery query;
int diff, stock;
for(iter cursor = cart.begin();cursor!=cart.end();cursor++){
query.prepare("SELECT stock FROM products WHERE id = cursor->getPid()");
query.exec();
// Need to save result of query into variable stock
stock = ??;
diff = stock - cursor->getAmount;
if(diff < 0){
return false;
}
}
return true;
}
जाहिर है इस समारोह नहीं कार्यात्मक, क्योंकि cursor-> getPid() निष्पादित नहीं कर रहा है, क्योंकि यह एक स्ट्रिंग है। तो यहां सवाल एस ++ - वैरिएबल को एसक्यूएल-क्वेरी में कैसे सम्मिलित करना है? नियमित सी ++ में मैं कुछ swprintf_s
फ़ंक्शन का उपयोग करता था। तो query.prepare(swprintf_s(...))
एक अच्छा विचार है?
दूसरी बात यह है कि query.exec()
और query.prepare()
दोनों के बाद से बूलियन्स है, जो सही या गलत लौटने के लिए, सफलता पर depeding हैं, मैं एक C++ चर में कैसे जमा कर सकते हैं प्रश्नों के परिणाम?
कृपया ध्यान दें, कि मैं क्यूटी के साथ एसक्यूएल और एसक्यूएल के लिए नया हूं। मैं क्यूटी 5 का उपयोग करता हूं। मैंने पहले ही QSqlQuery
वर्ग और उसके कार्यों के बारे में प्रलेखन पढ़ने की कोशिश की है, BindValue()
और addBindValue()
दिलचस्प लगते हैं। हालांकि मैं वास्तव में समझ नहीं पा रहा हूं कि वे कैसे काम करते हैं।
संपादित
तो अब मैं यहाँ एक न्यूनतम उदाहरण है कि अभी तक काम नहीं करता है, स्वीकार किए जाते हैं जवाब निम्नलिखित के बावजूद मिल गया है।
void MainWindow::on_ButtonSQL_clicked()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("...");
db.setDatabaseName("...");
db.setUserName("...");
db.setPassword("...");
db.setPort(3306);
db.open();
QMessageBox msgBox;
if (db.open()) {
msgBox.setText("It works :)");
msgBox.exec();
}
else {
msgBox.setText("No connection.");
msgBox.exec();
}
QSqlQuery query(db);
// This query worked!
query.exec("INSERT INTO users (id, username, balance) VALUES(25, 'someName', 10000)");
// initialize someNumber to check later, whether it was processed correctly.
int id = 2, someNumber = 20;
query.prepare("SELECT stock FROM products WHERE id = :myid");
query.bindValue(":myid", id);
query.exec();
QString idValue = query.boundValue(0).toString();
someNumber = query.value(0).toInt();
msgBox.setText("The stock is: "+QString::number(someNumber)+"\nThe placeholder has the value: "+idValue);
msgBox.exec();
}
पिछले MsgBox की
उम्मीद MsgBox है:
The stock is: 100
The placeholder value is: 2
आउटपुट वास्तव में है:
The stock is: 0
The placeholder value is: 2
मैं बजाय की कोशिश करते हैं लेकिन संकलक मुझे किसी भी चेतावनियां या त्रुटियां नहीं देता एक स्ट्रिंग (जैसे productName) का चयन करें, QString myProductName = query.value(0).toString()
(और कोड में संबंधित परिवर्तन) के साथ कहें, वापसी एक खाली स्ट्रिंग होगी।
** हल किया गया: ** स्वीकृत उत्तर में फ्लोरिस से टिप्पणी देखें। मुझे query.next()
याद आया।
FYI करें: यदि आप स्ट्रिंग 'swprintf_s' के समान स्वरूपण की एक क्यूटी समकक्ष के लिए देख रहे हैं,' QString' वर्ग के प्रलेखन, विशेष रूप से विभिन्न 'QString :: arg' कार्यों को पढ़ने जाते हैं। – RobbieE
उस जानकारी के लिए धन्यवाद! – Alex