Приложение C ++ подключается к SQL База данных сервера? - PullRequest
0 голосов
/ 23 января 2020

Я знаю, что могу подключиться к своей базе данных, потому что я могу делать операторы запросов в Visual Studio, но я не могу подключиться из своего приложения C ++. Это продолжается в случае SQL_ERROR.

Код:

    //Capstone main driver
    #include <iostream>
    #include <windows.h>
    #include <sqlext.h>
    #include <sqltypes.h>
    #include <sql.h>

    using namespace std;

    //const int MAX_CHAR = 1024;

    int main() {

        #define SQL_RESULT_LEN 240
        #define SQL_RETURN_CODE_LEN 3000

        //define handles and variables
        SQLHANDLE sqlConnHandle;
        SQLHANDLE sqlStmtHandle;
        SQLHANDLE sqlEnvHandle;
        SQLWCHAR retconstring[SQL_RETURN_CODE_LEN];

        //initializations
        sqlConnHandle = NULL;
        sqlStmtHandle = NULL;

        //allocations
        if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvHandle)) {

            goto COMPLETED;
        }

        if (SQL_SUCCESS != SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) {

            goto COMPLETED;
        }

        if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, &sqlConnHandle)) {

            goto COMPLETED;
        }

        //output
        cout << "Attempting connection to SQL Server..." << endl;

        //connect to SQL Server 
        //I am using a trusted connection and port 14808
        //it does not matter if you are using default or named instance
        //just make sure you define the server name and the port
        //You have the option to use a username/password instead of a trusted connection
        //but is more secure to use a trusted connection
        switch (SQLDriverConnect(sqlConnHandle,
            NULL,
            (SQLWCHAR*)L"Driver={ODBC Driver 13 for SQL Server};Server=tcp:myserver,1433;Database=CapstoneDB;Uid=CapstoneAdmin;Pwd=mypassword;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;",
            SQL_NTS,
            retconstring,
            1024,
            NULL,
            SQL_DRIVER_NOPROMPT)) {

        case SQL_SUCCESS:
            cout << "Successfully connected to SQL Server";
            cout << "\n";
            break;

        case SQL_SUCCESS_WITH_INFO:
            cout << "Successfully connected to SQL Server";
            cout << "\n";
            break;

        case SQL_INVALID_HANDLE:
            cout << "Could not connect to SQL Server: Invalid Handle";
            cout << "\n";
            goto COMPLETED;

        case SQL_ERROR:
            cout << "Could not connect to SQL Server: Error";
            cout << "\n";
            goto COMPLETED;

        default:
            break;
        }

        //if there is a problem connecting then exit application
        if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, sqlConnHandle, &sqlStmtHandle)) {

            goto COMPLETED;
        }

        //output
        cout << endl << "Executing T-SQL query..." << endl;

        //if there is a problem executing the query then exit application
      //else display query result
        if (SQL_SUCCESS != SQLExecDirect(sqlStmtHandle, (SQLWCHAR*)L"SELECT @@VERSION", SQL_NTS)) {
            cout << "Error querying SQL Server";
            cout << "\n";
            goto COMPLETED;
        }
        else {

            //declare output variable and pointer
            SQLCHAR sqlVersion[SQL_RESULT_LEN];
            SQLINTEGER ptrSqlVersion;

            while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) {

                SQLGetData(sqlStmtHandle, 1, SQL_CHAR, sqlVersion, SQL_RESULT_LEN, &ptrSqlVersion);

                //display query result
                cout << "\nQuery Result:\n\n";
                cout << sqlVersion << endl;
            }
        }

        //close connection and free resources
    COMPLETED:
        SQLFreeHandle(SQL_HANDLE_STMT, sqlStmtHandle);
        SQLDisconnect(sqlConnHandle);
        SQLFreeHandle(SQL_HANDLE_DBC, sqlConnHandle);
        SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle);

        return 0;
    }

Я использую приведенный выше код, но с моим адресом сервера и паролем в строке подключения.

...