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

C++ का उपयोग करके एक MySQL सर्वर से कनेक्ट करना

मैट की थोड़ी सी मदद से, मैं यह पता लगाने में सक्षम था कि समस्या क्या थी, लेकिन चूंकि उन्होंने इसे उत्तर के रूप में नहीं दिया था, इसलिए मुझे इसका उत्तर देना होगा ताकि इसे उन लोगों के लिए साझा किया जा सके जिनके पास समस्या है। एक ही समस्या, और उत्तर के रूप में चिह्नित करने के लिए भी।

तो, मेरी समस्या यह थी कि मैं डेटाबेस से कनेक्ट नहीं हो सका। जैसा कि मैट ने सुझाव दिया था, मुझे विस्तारित त्रुटि जानकारी का उपयोग करना चाहिए, जिसे SQLGetDiagRec के रूप में जाना जाता है और दस्तावेज़ीकरण के अनुसार तर्कों को भी ठीक करें। मुझे यह जानने में थोड़ा समय लगा कि SQLGetDiagRec . कैसे फ़ंक्शन काम करता है, लेकिन एक बार जब मैं wchar_t . को कनवर्ट करने में कामयाब रहा करने के लिए char * मैं उस त्रुटि को देख पा रहा था जो यह उत्पन्न कर रहा था।

कनेक्शन प्रयास ने मुझे त्रुटि दी Data source not found and no default driver specified . इससे मुझे एक सुराग मिला, यह दर्शाता है कि मैंने या तो गलत कनेक्शन स्ट्रिंग लिखी है या टेक्स्ट स्ट्रिंग को किसी तरह गलत व्याख्या या खराब कर दिया गया था।

कुछ नेट पर खोज कर मुझे अंतर्दृष्टि दी कि स्ट्रिंग का गलत अर्थ निकाला गया था, और इसे ठीक करने के लिए मुझे इसे एक शाब्दिक स्ट्रिंग बनाना पड़ा। निश्चित रूप से पर्याप्त है, स्ट्रिंग के सामने L लगाने से यह हल हो गया!

retcode = SQLDriverConnect(hdbc, 0, 
                           (SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;", 
                           _countof(L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;"), 
                           OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_COMPLETE);

साथ ही, मैंने सीखा कि प्रॉम्प्ट से कैसे छुटकारा पाया जाए, जो शुरुआती समस्या को ठीक करने के बाद पता लगाना काफी आसान था। विंडो हैंडल के लिए शून्य निर्दिष्ट करें, ड्राइवर पूर्णता को SQL_DRIVER_COMPLETE पर सेट करें और सुनिश्चित करें कि आप कनेक्शन स्ट्रिंग में आवश्यक सभी जानकारी जोड़ते हैं।

तो, अगली समस्या मेरे पास SQLExecDirect के साथ क्वेरी के साथ थी Syntax error or access violation saying कहते हुए एक त्रुटि दे रहा था . समस्या स्पष्ट रूप से कनेक्शन स्ट्रिंग के समान ही थी। निश्चित रूप से पर्याप्त

retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);

एक आकर्षण की तरह काम किया।

यह कोड पूरी तरह से, पूरी तरह कार्यात्मक है:

#include <iostream>
#include <windows.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <string>

using namespace std;

int main(){
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;

    SQLWCHAR OutConnStr[255];
    SQLSMALLINT OutConnStrLen;

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

             // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                retcode = SQLDriverConnect(
                    hdbc, 
                    0,
                    (SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;", 
                    _countof(L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;"),
                    OutConnStr,
                    255, 
                    &OutConnStrLen,
                    SQL_DRIVER_COMPLETE );

                // Allocate statement handle
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

                    // Process data
                    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);

                    if (retcode == SQL_SUCCESS) {
                        SQLINTEGER sTestInt, cbTestStr, cbTestInt, cbTestFloat, iCount = 1;
                        SQLFLOAT dTestFloat;
                        SQLCHAR szTestStr[200];
                        while (TRUE) {
                            retcode = SQLFetch(hstmt);
                            if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
                                cout<<"An error occurred";
                            }
                            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

                                SQLGetData(hstmt, 1, SQL_C_CHAR, szTestStr, 200, &cbTestStr);
                                SQLGetData(hstmt, 2, SQL_C_ULONG, &sTestInt, 0, &cbTestInt);
                                SQLGetData(hstmt, 3, SQL_C_DOUBLE, &dTestFloat, 0,&cbTestFloat);

                                /* Print the row of data */
                                cout<<"Row "<<iCount<<":"<<endl;
                                cout<<szTestStr<<endl;
                                cout<<sTestInt<<endl;
                                cout<<dTestFloat<<endl;
                                iCount++;
                            } else {
                                break;
                            }
                        }
                    }else{
                        cout<<"Query execution error."<<endl;
                    }

                    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    SQLDisconnect(hdbc);
                }else{ 
                    cout<<"Connection error"<<endl;
                }
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }

        system("pause");
    return 0;
}

बस दिखाने के लिए जाता है, यहां तक ​​​​कि छोटी से छोटी चीज भी सब कुछ विफल कर सकती है।

आपकी मदद के लिए धन्यवाद मैट।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. async और नोड js . में MySQL कॉल पर प्रतीक्षा करें

  2. रेडीस्टेडमेंट सिंटैक्स त्रुटि फेंकता है

  3. एक रिलेशनल डेटाबेस स्कीमा खाली करें

  4. mysql.sock नहीं खोजा जा सका

  5. त्रुटि! MySQL प्रबंधक या सर्वर PID फ़ाइल नहीं मिली! क्यूएनएपी