एक तैयार कथन का उपयोग करें, जो आपको मानों को पैरामीटर करने देता है, उसी तरह जैसे फ़ंक्शन आपको स्टेटमेंट ब्लॉक में चर को पैरामीटर करने देता है। अगर 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);
जैसा कि आप देखते हैं, कनेक्टर/सी++ सरल है। यह कम त्रुटि प्रवण भी है; मैंने शायद कनेक्टर/सी++ की तुलना में सी एपीआई का उपयोग करके अधिक गलतियां की हैं।
यह भी देखें:
- MySQL Connector/C++ का उपयोग करके डेटाबेस एप्लिकेशन विकसित करना ए>
- कनेक्टर C++ MySQL फोर्ज विकी में