2015-05-10 4 views
5

में 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() याद आया।

+1

FYI करें: यदि आप स्ट्रिंग 'swprintf_s' के समान स्वरूपण की एक क्यूटी समकक्ष के लिए देख रहे हैं,' QString' वर्ग के प्रलेखन, विशेष रूप से विभिन्न 'QString :: arg' कार्यों को पढ़ने जाते हैं। – RobbieE

+0

उस जानकारी के लिए धन्यवाद! – Alex

उत्तर

6

यह बहुत सीधे आगे वास्तव में है:

QSqlQuery query; 
query.prepare("Select stock from products where id = :input"); 
query.bindValue(":input", cursor->getPid()); 
query.exec(); 

आप स्ट्रिंग में तर्क के लिए मान बाँध। तर्क प्रारूप का पालन करें: :name। स्थितित्मक बाध्यकारी भी है जो क्रम में बांधता है?

QSqlQuery query; 
query.prepare("Select stock from products where id = ?"); 
// No need for an identifier 
query.bindValue(cursor->getPid()); 
query.exec(); 

रिकॉर्ड आप एक प्रश्न आप निम्न कर सकते से प्राप्त पुनरावृति करने के लिए:

QSqlQuery query; 
query.prepare("SELECT stock FROM employee WHERE id = ?"); 
query.bindValue(cursor->getPid()); 
query.exec(); 

if (query.next()) { 
    int stock = query.value(0).toInt(); 
    // You could store the information you obtain here in a vector or something 
} 

तुम भी पाश के लिए बाहर बयान तैयार डाल सकता है। यदि आप एकाधिक रिकॉर्ड्स को पुन: स्थापित करने में रुचि रखते हैं (एक चयन कथन से) तो आप थोड़े वक्तव्य के साथ if स्टेटमेंट को प्रतिस्थापित कर सकते हैं।

QSqlQuery::next() के संबंध में:

, परिणाम में अगले रिकॉर्ड प्राप्त करता है तो उपलब्ध है, और पुनः प्राप्त रिकॉर्ड पर क्वेरी की स्थिति। ध्यान दें कि परिणाम सक्रिय स्थिति में होना चाहिए और चयन करें() को इस फ़ंक्शन को कॉल करने से पहले सत्य वापस करना होगा या यह कुछ भी नहीं करेगा और झूठी वापसी करेगा।

As taken from QSqlQuery। रिकॉर्ड को वास्तव में .value(int) के साथ पहुंचने से पहले आपको यह कॉल करने की आवश्यकता होगी।

+0

इस अच्छी तरह से लिखित स्पष्टीकरण के लिए धन्यवाद। हालांकि, क्या आप मेरे संपादन को देख सकते हैं? यह अभी तक काम नहीं कर रहा है। – Alex

+0

@Alex इसका उत्तर यह है कि आप वास्तव में अगली पंक्ति (पढ़ने के लिए) को कॉल करना भूल गए हैं। मेरे पास उत्तर में आखिरी उदाहरण ध्यान दें: 'if (query.next()) {int stock = query.value (0) .toInt(); } '। परिणाम की पहली पंक्ति का अनुरोध किए बिना मूल्य पूछने से आपको सही जवाब नहीं मिलेगा! यदि आप 'query.next()' जोड़ते हैं तो इसे काम करना चाहिए। –

+1

धन्यवाद, अब यह एक आकर्षण की तरह काम करता है! :) – Alex

संबंधित मुद्दे