/* Sample program: row-binding.c */ #ifdef _WIN32 #include #endif #include #include #include #include void test1 (SQLHSTMT); void test2 (SQLHSTMT); 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); \ } #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 .. .. ..\n"); 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 i= 0; SQLRETURN rc; SQLINTEGER error_num; SQLBIGINT data_id; SQLCHAR data_name[21]; SQLINTEGER data_len= 0; byte pBuffer[74]= {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, SQLConnect(hdbc, (SQLCHAR*) "test2", SQL_NTS, (SQLCHAR*) "root", SQL_NTS, (SQLCHAR*) "", SQL_NTS)); ok_dbc(hdbc, SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)); ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS my_bulk", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "CREATE TABLE my_bulk (id bigint, name varchar(20))", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "INSERT INTO my_bulk (id, name) VALUES (255, \"abcdefg\"), (511, \"hijklmn\")", SQL_NTS)); ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE)); ok_stmt(hstmt, SQLExecDirect(hstmt, "SELECT * FROM my_bulk", SQL_NTS)); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)2, 0)); ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_SBIGINT, (SQLPOINTER)pBuffer, 8, &pBuffer[8])); ok_stmt(hstmt, SQLBindCol(hstmt, 2, SQL_C_CHAR, &pBuffer[12], 21, &pBuffer[33])); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)37, 0)); ok_stmt(hstmt, SQLFetch(hstmt)); for (i= 0; i < 2; i++) { int offs= i*37; memcpy(&data_id, &pBuffer[0 + offs], sizeof(SQLBIGINT)); memcpy(&data_len, &pBuffer[8 + offs], sizeof(SQLINTEGER)); printf("\nID:%I64d (len=%i) ", data_id, data_len); memcpy(data_name, &pBuffer[12 + offs], 21); memcpy(&data_len, &pBuffer[33 + offs], sizeof(SQLINTEGER)); printf("NAME: %s (len=%i)\n", data_name, data_len); } ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS my_bulk", SQL_NTS)); return 0; }