/* test case */ #include #include #include #include #include #include void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno); #define CHECKRC(FUNCSHN,MSG) CheckRC(FUNCSHN, MSG, __FILE__, __LINE__) SQLHENV hEnv = SQL_NULL_HENV; SQLHDBC hDbc = SQL_NULL_HDBC; SQLHSTMT hStmt = SQL_NULL_HSTMT; SQLCHAR* connString; SQLCHAR connOut[255]; /* buffer for connection output */ SQLSMALLINT szConnOut; /* num bytes returned in connOut */ SQLINTEGER Version = SQL_OV_ODBC3; void doDrop() { } void doCreate() { } void doTest() { #define STR_LEN 128+1 #define REM_LEN 254+1 /* Declare buffers for result set data */ SQLCHAR szCatalog[STR_LEN], szSchema[STR_LEN]; SQLCHAR szTableName[STR_LEN], szColumnName[STR_LEN]; SQLCHAR szTypeName[STR_LEN], szRemarks[REM_LEN]; SQLCHAR szColumnDefault[STR_LEN], szIsNullable[STR_LEN]; SQLINTEGER ColumnSize, BufferLength, CharOctetLength, OrdinalPosition; SQLSMALLINT DataType, DecimalDigits, NumPrecRadix, Nullable; SQLSMALLINT SQLDataType, DatetimeSubtypeCode; /* Declare buffers for bytes available to return */ SQLINTEGER cbCatalog, cbSchema, cbTableName, cbColumnName; SQLINTEGER cbDataType, cbTypeName, cbColumnSize, cbBufferLength; SQLINTEGER cbDecimalDigits, cbNumPrecRadix, cbNullable, cbRemarks; SQLINTEGER cbColumnDefault, cbSQLDataType, cbDatetimeSubtypeCode, cbCharOctetLength; SQLINTEGER cbOrdinalPosition, cbIsNullable; printf("Test....\n"); CHECKRC(SQLAllocStmt(hDbc, &hStmt), "SQLAllocStmt()" ); printf("SQLColumns....\n"); SQLColumns (hStmt, "test", SQL_NTS, NULL, 0, "tbl_test", SQL_NTS, NULL, 0); printf("SQLBIND....\n"); CHECKRC( SQLBindCol(hStmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&cbCatalog), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&cbTableName), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &cbTypeName), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &cbRemarks), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &cbColumnDefault), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0, &cbDatetimeSubtypeCode), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition), "SQLBindCol()" ); CHECKRC( SQLBindCol(hStmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &cbIsNullable), "SQLBindCol()" ); while(TRUE) { CHECKRC( SQLFetch(hStmt), "SQLFetch()" ); printf("Column name = %s %i, nullable = %i %s\n",szColumnName,cbCatalog,Nullable,szIsNullable); } printf("SQLFreeStmt....\n"); CHECKRC( SQLFreeStmt(hStmt, SQL_DROP), "SQLFreeStmt()" ); } int main(int argc, char** argv) { int nPrompt = SQL_DRIVER_NOPROMPT; if (argc < 2 || strlen(argv[1]) == 0) { // connString = (SQLCHAR *)"DRIVER=MySQL Connector/ODBC v5;UID=root"; connString = (SQLCHAR *)"DRIVER=MySQL ODBC 3.51 Driver;UID=root"; } else connString = (SQLCHAR *)argv[1]; if (SQLAllocEnv(&hEnv) != SQL_SUCCESS) { fprintf(stderr, "Unable to allocate SQLHENV\n"); return(1); } printf("Connect....\n"); SQLAllocEnv(&hEnv); CHECKRC( SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,Version,0 ), "SQLSetEnvAttr()" ); CHECKRC( SQLAllocConnect(hEnv, &hDbc), "SQLAllocConnect()" ); CHECKRC( SQLDriverConnect(hDbc, (HWND)0, connString, SQL_NTS, connOut, 255, &szConnOut, nPrompt), "SQLDriverConnect()" ); doDrop(); doCreate(); doTest(); printf("Disconnect....\n"); CHECKRC( SQLDisconnect(hDbc), "SQLDisconnect()" ); CHECKRC( SQLFreeConnect(hDbc), "SQLFreeConnect()" ); CHECKRC( SQLFreeEnv(hEnv), "SQLFreeEnv()" ); return 0; } void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno) { #define MSG_LNG 512 SQLCHAR szSqlState[MSG_LNG]; SQLINTEGER pfNativeError; SQLCHAR szErrorMsg[MSG_LNG]; SQLSMALLINT pcbErrorMsg; SQLRETURN ret = SQL_SUCCESS; int error = 0; if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND) { if (rc != SQL_SUCCESS_WITH_INFO) { fprintf(stderr, "\nERROR (%s:%d): %s\n", filename, lineno, msg); error = 1; } while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { ret = SQLError(hEnv, hDbc, hStmt, szSqlState, &pfNativeError, szErrorMsg, MSG_LNG, &pcbErrorMsg); switch (ret) { case SQL_SUCCESS: if (rc == SQL_SUCCESS_WITH_INFO) { fprintf(stderr, "\nINFO: (%s:%d): %s\n", filename, lineno, msg); } fprintf(stderr, "*** %s\n*** ODBC Code: %s, " "Driver Code: %ld\n\n", szErrorMsg, szSqlState, pfNativeError); break; case SQL_NO_DATA_FOUND: break; default: fprintf(stderr, "*** SQLError() failed with code=%d\n\n", ret); break; } } } if (error) exit(1); }