#include #include #include SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; #define ok_something(A, B, C) rc= B; if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO){ \ error_num= PrintError(C, A, rc); \ goto PROGRAM_END; \ } #define ok_env(A, B) ok_something(A,B, SQL_HANDLE_ENV) #define ok_dbc(A, B) ok_something(A,B, SQL_HANDLE_DBC) #define ok_stmt(A, B) ok_something(A,B, SQL_HANDLE_STMT) 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) { printf( "NO DATA .. .. .."); 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) { printf( " Error: %s\n", eMsg); } return (SQL_ERROR); } } int main(int argc, char * argv[]) { SQLRETURN rc; SQLCHAR connOut[255], szName[128]; SQLCHAR data1[255]= "1234.565", data[255]; SQLSMALLINT szConnOut, colcount; SQLINTEGER cbName; SQLLEN paramlen= 7; SQLLEN cbRead=0; SQLULEN nRowsFetched = 0; int error_num= 0; SQLLEN StrLen_or_IndPtr; SQLCHAR pBuffer[65536]; if(sizeof(SQLLEN) != 8) return 0; ok_env(henv, SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv)); ok_env(henv, SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_NTS)); ok_env(henv, SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc)); ok_dbc(hdbc, SQLDriverConnect(hdbc, NULL, "DSN=myodbc3", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT)); ok_dbc(hdbc, SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)); ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS bug61873", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "CREATE TABLE bug61873(id INT PRIMARY KEY, txt TEXT)", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "INSERT INTO bug61873(id, txt) VALUES (1, REPEAT('a', 4096))", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "SELECT * FROM bug61873", SQL_NTS)); ok_stmt(hstmt, SQLFetch(hstmt)); printf("sizeof(SQLLEN)=%u\n", sizeof(SQLLEN)); StrLen_or_IndPtr= 0xFFFFFFFFFFFFFFFF; printf("StrLen_or_IndPtr: [DEC: %llu][HEX: %.16llX]\n", StrLen_or_IndPtr, StrLen_or_IndPtr); ok_stmt(hstmt, SQLGetData(hstmt, 2, SQL_C_CHAR, pBuffer, 65536, &StrLen_or_IndPtr)); printf("GET DATA\nStrLen_or_IndPtr: [DEC: %llu][HEX: %.16llX]\n", StrLen_or_IndPtr, StrLen_or_IndPtr); PROGRAM_END: rc = SQLDisconnect(hdbc); rc = SQLFreeConnect(hdbc); rc = SQLFreeEnv(henv); }