none
ODBC驱动访问ORACLE数据库的问题! RRS feed

  • 问题

  • 使用odbc驱动来访问oracle10g数据库时,发现一个问题:

    我们连接到数据库SQLConnect后,程序内存大约开始增加5000K,使用SQLDisconnect,并且free各种HANDLE后程序内存依然没有被释放。 有没有什么办法解决这个问题?

    以下是程序,是下载的的官方demo修改的。 SQLConnect这个地方,就算没有连接成功,内存也会增加。

    #undef UNICODE
    #include <windows.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <stdio.h>
    #include <conio.h>
    #include <tchar.h>
    #include <stdlib.h>
    #include <sal.h>
    
    int main(void)
    {
    	SQLHENV     hEnv = NULL;
    	SQLHDBC     hDbc = NULL;
    	SQLHSTMT    hStmt = NULL;
    	int ret = 0;
    	// Allocate an environment
    	printf("Alloc henv...\n");
    	system("pause");
    	if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR)
    	{
    		printf("Unable to allocate an environment handle\n");
    		exit(-1);
    	}
    
    	// Register this as an application that expects 3.x behavior,
    	// you must register something if you use AllocHandle
    	SQLSetEnvAttr(hEnv,
    		SQL_ATTR_ODBC_VERSION,
    		(SQLPOINTER)SQL_OV_ODBC3,
    		0);
    
    	// Allocate a connection
    	SQLCHAR dsn[32] = "ORCL";
    	SQLCHAR user[32] = "SCOTT";
    	SQLCHAR passwd[32] = "tiger";
    
    	printf("Alloc hdbc...\n");
    	system("pause");
    	SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
    	//792K
    	SQLSetConnectAttr(hDbc, SQL_LOGIN_TIMEOUT, 0, 0);
    	//796K
    	printf("connect...\n");
    	system("pause");
    	ret = SQLConnect(hDbc,dsn,SQL_NTS,user,SQL_NTS,passwd,SQL_NTS);
    	printf("connect ret : %d\n", ret);
    	//5956K
    #if 0
    	SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
    
    	// Free ODBC handles and exit
    
    	if (hStmt)
    	{
    		SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
    	}
    
    //	SQLFreeConnect(hDbc);
    	ret = SQLEndTran(SQL_HANDLE_DBC, hDbc, SQL_COMMIT);
    	printf("commit ret : %d\n", ret);
    	ret = SQLEndTran(SQL_HANDLE_DBC, hDbc, SQL_ROLLBACK);
    	printf("rollback ret : %d\n", ret);
    #endif
    	printf("disconnect...\n");
    	system("pause");
    	ret = SQLDisconnect(hDbc);
    	printf("disconnect ret : %d\n", ret);
    	if (hDbc)
    	{	
    		printf("free hdbc...\n");
    		system("pause");
    		SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
    	}
    	//5824K
    
    	if (hEnv)
    	{	
    		printf("free henv...\n");
    		system("pause");
    		SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    	}
    	printf("done...\n");
    	system("pause");
    
    	//5548K 
    	return 0;
    
    }


    2015年11月10日 6:34