Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

C++ और mysql डायनेमिक mysql क्वेरीज़ कैसे भेजें?

एक तैयार कथन का उपयोग करें, जो आपको मानों को पैरामीटर करने देता है, उसी तरह जैसे फ़ंक्शन आपको स्टेटमेंट ब्लॉक में चर को पैरामीटर करने देता है। अगर MySQL Connector/C++ का इस्तेमाल कर रहे हैं :

// use std::unique_ptr, boost::shared_ptr, or whatever is most appropriate for RAII
// Connector/C++ requires boost, so 
std::unique_ptr<sql::Connection> db;
std::unique_ptr<sql::PreparedStatement> getPassword
std::unique_ptr<sql::ResultSet> result;
std::string name = "Nikolai Gogol";
std::string password;

...

getPassword = db->prepareStatement("SELECT pass FROM users WHERE name=? LIMIT 1");

getPassword->setString(1, name);
result = getPassword->execute();
if (result->first()) {
    password = result->getString("pass");
} else {
    // no result
    ...
}

// smart pointers will handle deleting the sql::* instances

डेटाबेस एक्सेस को संभालने के लिए कक्षाएं बनाएं और उसे एक विधि में लपेटें, और शेष एप्लिकेशन को यह जानने की भी आवश्यकता नहीं है कि डेटाबेस का उपयोग किया जा रहा है।

यदि आप वास्तव में किसी कारण से पुराने C API का उपयोग करना चाहते हैं:

MYSQL *mysql;
...

const my_bool yes=1, no=0;
const char* getPassStmt = "SELECT password FROM users WHERE username=? LIMIT 1";
MYSQL_STMT *getPassword;
MYSQL_BIND getPassParams;
MYSQL_BIND result;

std::string name = "Nikolai Gogol";
std::string password;

if (! (getPassword = mysql_stmt_init(mysql))) {
    // error: couldn't allocate space for statement
    ...
}
if (mysql_stmt_prepare(getPassword, getPassStmt, strlen(getPassStmt))) {
    /* error preparing statement; handle error and 
       return early or throw an exception. RAII would make
       this easier.
    */
    ...
} else {
    unsigned long nameLength = name.size();
    memset(&getPassParams, 0, sizeof(getPassParams));
    getPassParams.buffer_type = MYSQL_TYPE_STRING;
    getPassParams.buffer = (char*) name.c_str();
    getPassParams.length = &nameLength;

    if (mysql_stmt_bind_param(getPassword, &getPassParams)) {
        /* error binding param */
        ...
    } else if (mysql_stmt_execute(getPassword)) {
        /* error executing query */
        ...
    } else {
        // for mysql_stmt_num_rows()
        mysql_stmt_store_result(getPassword);
        if (mysql_stmt_num_rows(getPassword)) {
            unsigned long passwordLength=0;
            memset(&result, 0, sizeof(result));
            result.length = &passwordLength;
            mysql_stmt_bind_result(getPassword, &result);

            mysql_stmt_fetch(getPassword);
            if (passwordLength > 0) {
                result.buffer = new char[passwordLength+1];
                memset(result.buffer, 0, passwordLength+1);
                result.buffer_length = passwordLength+1;
                if (mysql_stmt_fetch_column(getPassword, &result, 0, 0)) {
                    ...
                } else {
                    password = static_cast<const char*>(result.buffer);
                }
            }
        } else {
            // no result
            cerr << "No user '" << name << "' found." << endl;
        }
    }
    mysql_stmt_free_result(getPassword);
}
mysql_stmt_close(getPassword);

mysql_close(mysql);

जैसा कि आप देखते हैं, कनेक्टर/सी++ सरल है। यह कम त्रुटि प्रवण भी है; मैंने शायद कनेक्टर/सी++ की तुलना में सी एपीआई का उपयोग करके अधिक गलतियां की हैं।

यह भी देखें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL क्वेरी टाइमिंग आउट:(70100):क्वेरी निष्पादन बाधित हो गया था

  2. सी # MySQL कनेक्टर

  3. MySQL में पदानुक्रमित प्रश्न

  4. MySQL में अल्पविराम-सीमांकित स्ट्रिंग के भीतर मान बदलें?

  5. MYSQL डुप्लिकेट पंक्तियों को लौटा रहा है