// SQLColumns_Function.cpp // compile with: ODBC32.lib #include #include #include #include #include #define ODBC_PUBLIC #include "odbc.h" #include #include #include #ifdef WIN32 # include # define sleep(x) Sleep(x*1000) # include #else # include # include #endif #define STR_LEN 128 + 1 #define REM_LEN 254 + 1 #define TRYODBC(h, ht, x) { RETCODE rc = x;\ if (rc != SQL_SUCCESS) \ { \ HandleDiagnosticRecord (h, ht, rc); \ } \ } void HandleDiagnosticRecord(SQLHANDLE hHandle, SQLSMALLINT hType, RETCODE RetCode) { SQLSMALLINT iRec = 0; SQLINTEGER iError; char szMessage[1000]; char szState[SQL_SQLSTATE_SIZE + 1]; if (RetCode == SQL_INVALID_HANDLE) { printf("Invalid handle!\n"); return; } SQLRETURN ret; while ((ret = SQLGetDiagRec(hType, hHandle, ++iRec, szState, &iError, szMessage, (SQLSMALLINT) (sizeof(szMessage) / sizeof(char)), (SQLSMALLINT *) NULL)) == SQL_SUCCESS) { if (strncmp(szState, "01004", 5)) { printf("[%5.5s] %s (%d)\n", szState, szMessage, iError); } } } // Declare buffers for result set data SQLCHAR szSchema[STR_LEN]; SQLCHAR szCatalog[STR_LEN]; SQLCHAR szColumnName[STR_LEN]; SQLCHAR szTableName[STR_LEN]; SQLCHAR szTypeName[STR_LEN]; SQLCHAR szRemarks[REM_LEN]; SQLCHAR szColumnDefault[STR_LEN]; SQLCHAR szIsNullable[STR_LEN]; SQLINTEGER ColumnSize; SQLINTEGER BufferLength; SQLINTEGER CharOctetLength; SQLINTEGER OrdinalPosition; SQLSMALLINT DataType; SQLSMALLINT DecimalDigits; SQLSMALLINT NumPrecRadix; SQLSMALLINT Nullable; SQLSMALLINT SQLDataType; SQLSMALLINT DatetimeSubtypeCode; SQLHSTMT hstmt = NULL; // Declare buffers for bytes available to return SQLINTEGER cbCatalog; SQLINTEGER cbSchema; SQLINTEGER cbTableName; SQLINTEGER cbColumnName; SQLINTEGER cbDataType; SQLINTEGER cbTypeName; SQLINTEGER cbColumnSize; SQLLEN cbBufferLength; SQLINTEGER cbDecimalDigits; SQLINTEGER cbNumPrecRadix; SQLINTEGER cbNullable; SQLINTEGER cbRemarks; SQLINTEGER cbColumnDefault; SQLINTEGER cbSQLDataType; SQLINTEGER cbDatetimeSubtypeCode; SQLINTEGER cbCharOctetLength; SQLINTEGER cbOrdinalPosition; SQLINTEGER cbIsNullable; int main() { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt = 0; SQLRETURN retcode; SQLCHAR conStr[] ="DSN=myodbc8w;DRIVER={/home/qsdb/code/install/mysql-connector-odbc/lib/libmyodbc8w.so};SERVER=127.0.0.1;port=60017;DATABASE=test;UID=test;PASSWORD=test;CharSet=utf8;Protocol=TCPIP;no_ssps=1;"; retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); retcode = SQLDriverConnect(hdbc, NULL, conStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT); retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); //retcode = SQLColumns(hstmt, NULL, 0, (SQLCHAR*)"test", SQL_NTS, (SQLCHAR*)"test_gbk", SQL_NTS, NULL, 0); TRYODBC(hstmt, SQL_HANDLE_STMT, retcode = SQLColumns(hstmt, (SQLCHAR*)"test", SQL_NTS, NULL, 0, (SQLCHAR*)"test_gbk", SQL_NTS, NULL, 0)); printf("Get retcode:%d, SQLColumns Result:\n", retcode); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { // Bind columns in result set to buffers SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&cbCatalog); SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema); SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&cbTableName); SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName); SQLBindCol(hstmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType); SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &cbTypeName); SQLBindCol(hstmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize); SQLBindCol(hstmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength); SQLBindCol(hstmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits); SQLBindCol(hstmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix); SQLBindCol(hstmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable); SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &cbRemarks); SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &cbColumnDefault); SQLBindCol(hstmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType); SQLBindCol(hstmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0, &cbDatetimeSubtypeCode); SQLBindCol(hstmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength); SQLBindCol(hstmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition); SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &cbIsNullable); while (SQL_SUCCESS == retcode) { retcode = SQLFetch(hstmt); if (retcode == SQL_NO_DATA_FOUND) { break; } printf("column:%s, type:%s\n", szColumnName, szTypeName); /* if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) 0; // show_error(); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 0; // Process fetched data else break; */ } } }