Mysql
 sql >> база данни >  >> RDS >> Mysql

Свързване към MySQL сървър с помощта на C++

С малко помощ от Мат успях да разбера какъв е проблемът, но тъй като той не го даде под формата на отговор, ще трябва да отговоря, за да може да бъде споделен за тези, които имат същия проблем, както и да маркирате като отговорено.

И така, моят проблем беше, че не можах да се свържа с базата данни. Както Мат предложи, трябва да използвам разширената информация за грешка, известна като 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);

В същото време научих как да се отърва от подкана, което беше доста лесно да се разбере след коригиране на първоначалния проблем. Посочете null за манипулатора на прозореца, задайте завършването на драйвера на SQL_DRIVER_COMPLETE и се уверете, че сте добавили цялата необходима информация в низа за връзка.

И така, следващият проблем, който имах със заявката с SQLExecDirect даваше грешка, казвайки Syntax error or access violation . Проблемът очевидно беше същият като с низа за връзка. Със сигурност достатъчно

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. Защо LEFT JOIN на MySQL връща NULL записи, когато е с клауза WHERE?

  2. com.mysql.jdbc.exceptions.MySQLSyntaxErrorException при използване на PreparedStatement

  3. Как да съхранявам корелационни стойности между потребителите в база данни, използвайки MySQL и PHP?

  4. IF условие в mysql скрипт

  5. MySql:MyISAM срещу Inno DB!