Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menghubungkan ke server MySQL menggunakan C++

Dengan sedikit bantuan dari Mat, saya dapat mengetahui apa masalahnya, tetapi karena dia tidak memberikannya dalam bentuk jawaban, saya harus menjawabnya sehingga dapat dibagikan kepada mereka yang memiliki masalah yang sama, dan juga untuk menandai sebagai telah dijawab.

Jadi, masalah saya adalah saya tidak dapat terhubung ke database. Seperti yang disarankan Mat, saya harus menggunakan info kesalahan yang diperluas, yang dikenal sebagai SQLGetDiagRec dan juga perbaiki argumen sesuai dengan dokumentasi. Butuh beberapa saat untuk mempelajari cara SQLGetDiagRec fungsi berfungsi, tetapi setelah saya berhasil mengonversi wchar_t ke char * Saya dapat melihat kesalahan yang dihasilkannya.

Upaya koneksi memberi saya kesalahan Data source not found and no default driver specified . Itu memberi saya petunjuk, yang menunjukkan bahwa saya menulis string koneksi yang salah atau string teks entah bagaimana disalahartikan atau rusak.

Melakukan beberapa mencari di internet memberi saya wawasan bahwa string itu disalahartikan, dan untuk memperbaikinya saya harus menjadikannya string literal. Tentunya cukup, menempatkan L di depan string menyelesaikannya!

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);

Pada saat yang sama, saya belajar cara menghilangkan prompt, yang cukup mudah diketahui setelah memperbaiki masalah awal. Tentukan null untuk pegangan jendela, setel penyelesaian driver ke SQL_DRIVER_COMPLETE dan pastikan Anda menambahkan semua informasi yang diperlukan dalam string koneksi.

Jadi, masalah berikutnya yang saya miliki dengan kueri dengan SQLExecDirect memberikan kesalahan yang mengatakan Syntax error or access violation . Masalahnya jelas sama dengan string koneksi. Pasti cukup

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

Bekerja seperti pesona.

Berikut kode secara keseluruhan, berfungsi penuh:

#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;
}

Hanya untuk menunjukkan, bahkan hal terkecil pun bisa membuat semuanya gagal.

Terima kasih Mat atas bantuan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDOException "tidak dapat menemukan driver"

  2. Basis data:Cara kinerja terbaik untuk menanyakan data lokasi geografis?

  3. cara memberikan nomor seri yang sama untuk grup catatan di mysql

  4. Tingkatkan bidang basis data sebesar 1

  5. Bagaimana cara memasukkan file BLOB dan CLOB di MySQL?