#include #include #include #include #include #ifndef TRUE #define TRUE 1 #endif #define MAXCOLS 100 #define MAX_DATA_LEN 255 #define TAB_LEN SQL_MAX_TABLE_NAME_LEN + 1 #define COL_LEN SQL_MAX_COLUMN_NAME_LEN + 1 SQLHENV henv; SQLHDBC hdbc; SQLINTEGER PrintError(SQLSMALLINT handleType, SQLHANDLE handle, SQLRETURN rcode) { SQLRETURN rc = SQL_ERROR; SQLCHAR sqlState[6]; SQLCHAR eMsg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER nError; SQLSMALLINT msgLen; if (rcode == SQL_NO_DATA) { std::cout << "NO DATA .. .. .." << std::endl; return(SQL_NO_DATA); } else { rc = SQLGetDiagRec(handleType, handle, 1, sqlState, &nError, eMsg, sizeof(eMsg), &msgLen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { std::cout << " Error: " << eMsg << std::endl; } return (SQL_ERROR); } } int main(int argc, char * argv[]) { SQLRETURN retc; SQLCHAR connString[256] = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;PORT=3306;USER=root;PWD=;Database=testdb;Option=4;"; SQLCHAR connOut[255]; /* buffer for connection output */ SQLSMALLINT szConnOut; /* num bytes returned in connOut */ argv[1] = "myodbc1"; argv[2] = "root"; argv[3] = ""; retc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_ENV, henv, retc)); retc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_NTS); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_ENV, henv, retc)); retc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_ENV, henv, retc)); std::cout << "Connecting to " << argv[1] << std::endl; retc = SQLDriverConnect(hdbc, GetDesktopWindow(), connString, SQL_NTS, connOut, 255, &szConnOut, 0); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_DBC, hdbc, retc)); /*************************************************************************************/ SQLHANDLE hstmt1=NULL; SQLCHAR Val[255]; long n; retc = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt1); retc = SQLExecDirect(hstmt1, (SQLCHAR*)"SELECT GROUP_CONCAT(fl1, fl2) as col1 FROM t2 GROUP BY fl1 ORDER BY fl1", 73); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_STMT, hstmt1, retc)); while ((retc == SQL_SUCCESS) || (retc == SQL_SUCCESS_WITH_INFO)) { retc = SQLBindCol(hstmt1, 1, SQL_C_CHAR, &Val, 255, &n); if (retc != SQL_SUCCESS && retc != SQL_SUCCESS_WITH_INFO) return(PrintError(SQL_HANDLE_STMT, hstmt1, retc)); /* Fetch and display the result set. */ retc = SQLFetch(hstmt1); if (retc == SQL_SUCCESS || retc == SQL_SUCCESS_WITH_INFO) std::cout << "COL val -> " << Val << std::endl; } /* Close the cursor (the hstmt is still allocated). */ SQLFreeStmt(hstmt1, SQL_CLOSE); }