// == HEADER FILES == #include "stdafx.h" #ifdef WIN32 #include #endif // WINDOWS #include // == GLOBAL VARIABLES == static SQLHANDLE henv; // == PROTOTYPES == static int checkRC(RETCODE, char *, SQLHANDLE, SQLHANDLE, SQLHANDLE); static RETCODE runProcedureMySQL(SQLHANDLE); // == DEFINES == #define MAX_CONNECT_STRING (1024) #define TREAT_SUCCESS_WITH_INFO_FATAL (0) #define COLUMN_MAX_SIZE (18) #define CURRENT_OFFSET 0 #define UPDATE_OFFSET 3 #define INSERT_OFFSET 6 #define DELETE_OFFSET 9 #define INSERT_ARRAY_SIZE 12 #define chkRC(errorMsg) { \ RETCODE __rc; \ if ((__rc = checkRC (rc, errorMsg, henv, hdbc, hstmt)) != SQL_SUCCESS) { \ if (!(__rc == SQL_SUCCESS_WITH_INFO && TREAT_SUCCESS_WITH_INFO_FATAL)) { \ goto exit; \ } \ } \ printf ("[INFO]: %s is successful.\n", errorMsg); \ } // == FUNCTIONS == static int checkRC(RETCODE retCode, char *msgString, SQLHANDLE henv, SQLHANDLE hdbc, SQLHANDLE hstmt) { RETCODE rc = SQL_SUCCESS; SQLSMALLINT handleType = (hstmt != NULL ? SQL_HANDLE_STMT : (hdbc != NULL ? SQL_HANDLE_DBC : SQL_HANDLE_ENV)); SQLHANDLE handle = (hstmt != NULL ? hstmt : (hdbc != NULL ? hdbc : henv)); SQLWCHAR sqlState[6], msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER nativeError; SQLSMALLINT recNum = 1; SQLSMALLINT msgLen; if (retCode == SQL_SUCCESS) { return rc; } if (handle == NULL) { rc = SQL_ERROR; return rc; } while ((rc = SQLGetDiagRec(handleType, handle, recNum, sqlState, &nativeError, msg, sizeof(msg), &msgLen)) != SQL_NO_DATA) { printf("ERROR: %s", msgString); wprintf(L" [NativeError: %d, SQLSTATE: %s, errorMsg: %s]\n", nativeError, sqlState, msg); recNum++; } return retCode; } int main() { RETCODE rc = SQL_SUCCESS; SQLHANDLE hdbc, hstmt; SQLWCHAR sConnectString[MAX_CONNECT_STRING] = L"Driver={MySQL ODBC 8.0 Unicode Driver};Server=inel65cass30001;Database=cloud;Port=3306;USER=cloud;NO_SSPS=1;initstmt=set time_zone = '+00:00';Charset=UTF8;OPTION=3;SSLMODE=DISABLED;PASSWORD="; SQLWCHAR sConnectStringOut[MAX_CONNECT_STRING]; SQLSMALLINT lenConnectString = MAX_CONNECT_STRING; SQLSMALLINT lenConnectStringOut = MAX_CONNECT_STRING; SQLWCHAR sDriverVersion[128]; henv = hdbc = hstmt = NULL; // -- Allocate environment handle -- rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); chkRC("SQLAllocHandle(SQL_HANDLE_ENV)"); // -- Set ODBC Version -- rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC2, 0); chkRC("SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)"); // -- Allocate database handle -- rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); chkRC("SQLAllocHandle(SQL_HANDLE_DBC)"); rc = SQLDriverConnect(hdbc, NULL, sConnectString, lenConnectString, sConnectStringOut, lenConnectStringOut, &lenConnectStringOut, SQL_DRIVER_NOPROMPT); chkRC("SQLDriverConnect()"); rc = SQLGetInfo(hdbc, SQL_DRIVER_VER, sDriverVersion, sizeof(sDriverVersion), NULL); chkRC("SQLGetInfo(SQL_DRIVER_VER)"); wprintf(L"Driver Version: %s\n", sDriverVersion); runProcedureMySQL(hdbc); // -- Disconnect the database -- rc = SQLDisconnect(hdbc); chkRC("SQLDisconnect()"); // -- Deallocate database handle -- rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc); chkRC("SQLFreeHandle(SQL_HANDLE_DBC)"); // -- Deallocate environment handle -- rc = SQLFreeHandle(SQL_HANDLE_ENV, henv); chkRC("SQLFreeHandle(SQL_HANDLE_ENV)"); exit: return rc; } RETCODE runProcedureMySQL(SQLHANDLE hdbc) { RETCODE rc = SQL_SUCCESS; SQLHANDLE hstmt; SQLLEN indC1 = SQL_NTS, indC2 = SQL_NTS; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); chkRC("SQLAllocHandle"); int a = 1; SQLCHAR b[40]; rc = SQLPrepare(hstmt, (SQLWCHAR*)L"{call cloud.GetCompanyNameFromID(?,?)}", SQL_NTS); //rc = SQLPrepare(hstmt, (SQLWCHAR*)L"{call cloud.GetCompanyNameFromId2(?)}", SQL_NTS); chkRC("SQLPrepare(CALL)"); rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 4, 0, &a, 4, &indC1); chkRC("SQLBindParameter(a)"); rc = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, 60, 0, b, 61, &indC2); chkRC("SQLBindParameter(b)"); rc = SQLExecute(hstmt); chkRC("SQLExecute()"); rc = SQLFetch(hstmt); chkRC("SQLFetch()"); rc = SQLGetData(hstmt, 1, SQL_C_CHAR, b, 40, &indC2); chkRC("SQLGetData()"); printf("Value of a: %d\n", a); printf("Value of b: %s\n", b); wsprintf(L"Value of b: %s\n", (SQLWCHAR*)b); exit: return rc; }