#include #include #include #include #include #include #include #include #include #define RC_SUCCESSFUL(rc) (((rc) == SQL_SUCCESS) || ((rc) == SQL_SUCCESS_WITH_INFO)) #define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc))) SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc = SQL_NULL_HDBC; SQLHSTMT hstmt= SQL_NULL_HSTMT; char szSqlState[SQL_MAX_MESSAGE_LENGTH], szErrorMsg[SQL_MAX_MESSAGE_LENGTH]; #define MAXBUFLEN 255 #define TAB_LEN SQL_MAX_TABLE_NAME_LEN + 1 #define COL_LEN SQL_MAX_COLUMN_NAME_LEN + 1 #define STR_LEN 128 #define REM_LEN 254+1 #define BIG_DATA_LEN 1024 SQLCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT MsgLen; RETCODE retcode; char szDSN[20] ; char szUID[20] ; char szAuthStr[20] ; int count = 10, n , i; int iInterval; void exit_nicely(){ if( RC_NOTSUCCESSFUL(retcode) ) { SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, (SQLCHAR*)szSqlState, &NativeError,(SQLCHAR*)szErrorMsg, SQL_MAX_MESSAGE_LENGTH, &MsgLen); fprintf(stdout,"SqlState=%s, NativeError=%d, ErrorMsg=%s\n", szSqlState, NativeError, szErrorMsg); SQLExecDirect(hstmt , (SQLCHAR*)"ROLLBACK" , SQL_NTS); } //SQLExecDirect(hstmt , (SQLCHAR*)"ROLLBACK" , SQL_NTS); SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT); /* Clean up. */ SQLFreeStmt(hstmt, SQL_CLOSE); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); //getchar(); exit(1); } void initDBCon(){ // Allocate the ODBC Environment and save handle. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv); // Let ODBC know this is an ODBC 3.0 application. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); // Allocate an ODBC connection handle and connect. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); //Set Connect Attr retcode = SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); //Connect retcode = SQLConnect(hdbc,(SQLCHAR*)szDSN, (SQLSMALLINT)strlen(szDSN), (SQLCHAR*)szUID, (SQLSMALLINT)strlen(szUID), (SQLCHAR*)szAuthStr, (SQLSMALLINT)strlen(szAuthStr)); if( RC_NOTSUCCESSFUL(retcode) ) { exit_nicely(); } // Allocate statement handles and do ODBC processing. SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); return; } void freeDBCon(){ SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT); /* Clean up. */ SQLFreeStmt(hstmt, SQL_CLOSE); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return; } void testInsert() { char *sqlInsert="insert into TestLeak values(?,?,?)"; char szTmp[101]; SQLINTEGER sOrderID=0 , sOrderID1=0 , cbValue2 = SQL_NTS; SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0; //SQLINTEGER cbData; int i; //initialize memset(szTmp,0,101); memset(szTmp,'a',10);//insert 'a' //INSERT for(i = 0 ; i < count ; i++) { retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlInsert, SQL_NTS); SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,STR_LEN, 0, &szTmp, 0, &cbValue2); SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID); sOrderID = i; retcode = SQLExecute(hstmt); if( RC_NOTSUCCESSFUL(retcode) ) { exit_nicely(); } } //retcode = SQLFreeStmt(hstmt,SQL_RESET_PARAMS); SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT); } void testUpdate() { char *sqlUpdate="update TestLeak set c2 = ? where c1 = ?"; char szTmp[101]; SQLINTEGER sOrderID=0 , sOrderID1=0 , cbValue2 = SQL_NTS; SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0; int i; //initialize memset(szTmp,0,101); memset(szTmp,'b',10);//update to 'b' //Update for(i = 0 ; i < count ; i++) { retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlUpdate, SQL_NTS); SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,STR_LEN, 0, &szTmp, 0, &cbValue2); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID); //SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID); sOrderID = i; retcode = SQLExecute(hstmt); if( RC_NOTSUCCESSFUL(retcode) ) { exit_nicely(); } } SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT); } void testDelete() { char *sqlDelete="DELETE from TestLeak where c1 = ?"; //char szTmp[101]; SQLINTEGER sOrderID=0 , sOrderID1=0; SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0; int i; //Delete for(i = 0 ; i < count ; i++) { retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlDelete, SQL_NTS); SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID); sOrderID = i; retcode = SQLExecute(hstmt); if( RC_NOTSUCCESSFUL(retcode) ) { exit_nicely(); } } SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT); } int main(int argc, char *argv[] ) { int m = 1; if( argc == 1 ){//default sprintf(szDSN,"postgre_8.02\0"); sprintf(szUID,"postgres\0"); sprintf(szAuthStr,"postgres\0"); iInterval = 1; }else if( argc == 5 ){ sprintf(szDSN,argv[1]);//DSN sprintf(szUID,argv[2]);//User sprintf(szAuthStr,argv[3]);//Password iInterval = atoi(argv[4]);//Interval }else{ fprintf(stdout,"invalid args!\n"); fprintf(stdout,"Usage: testODBC.exe "); return(0); } //----test begin----- while(true){ fprintf(stdout,"connect....\n"); initDBCon(); fprintf(stdout,"insert....\n"); testInsert(); fprintf(stdout,"update....\n"); testUpdate(); fprintf(stdout,"delete....\n"); testDelete(); Sleep(1*1000); fprintf(stdout,"free....\n"); freeDBCon(); } //----test end----- exit_nicely(); }