SQL_NUMERIC 또는 SQL_C_BINARY 데이터 Jet ODBC 드라이버 FIX: 메모리 누수

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

273772
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
현상
Jet ODBC 드라이버를 SQLBindParameter 를 함수를 호출할 때 및 SQL 데이터 형식이 SQL_NUMERIC 또는 SQL_C_BINARY SQL_WCHAR 위해 바인딩할 때 바인딩할 때 메모리 누수가 발생합니다.

성능 모니터 (PerfMon) 프로세스가 전용 바이트 감시할 사용하려면 늘릴, 점진적 있지만 일정한 메모리 참조, 문 또는 연결을 닫으면 메모리가 해제되지 않습니다.
원인
버퍼 내에서 Jet ODBC 드라이버는 ODBC 매개 변수 데이터 형식을 Jet 데이터베이스 엔진의 원시 데이터 형식을 변환하는 데 도움이 되는 사용됩니다. 이러한 버퍼는 문을 핸들에서 매개 변수 설명자 (IPDs) 의 일부로 유지 관리되는 포인터를 통해 참조됩니다.

일반적으로, 코드는 포인터가 이미 올바른 메모리 버퍼 참조하는 및 있으면 버퍼가 다시 확인합니다. 그러나 SQL_NUMERIC 데이터 바인딩할 때 또는 SQL_C_BINARY SQL_WCHAR 위해 바인딩할 때 새 메모리를 할당하고 먼저 검사하지 않고 포인터가 할당된 및 이전 값을 덮어씁니다.
해결 방법
이 문제는 Windows 2000 및 MDAC 2.5를 최신 서비스 팩이 해결되었습니다.
  • 이 문제를 해결하려면 Windows 2000용 최신 서비스 팩을 구하십시오. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    260910최신 Windows 2000 서비스 팩을 구하는 방법
  • 이 문제를 해결하려면 Microsoft 데이터 액세스 구성 요소 2.5는 최신 서비스 팩을 구하십시오. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    293312정보: 최신 MDAC 2.5 구하는 방법 서비스 팩
이 수정의 영어 버전은 다음 파일 특성을 가집니다 또는 나중에:
   Date        Version       Size              File name       ---------------------------------------------------------------------   09/13/00    4.0.5708.0    270,608 bytes    Odbcjt32.dll   09/14/00    1.10.101.0    295,696 bytes    Q273772_W2K_SP2_x86_en.EXE				
참고: Microsoft 데이터 액세스 구성 요소 (MDAC) 2.5 서비스 팩 1 (SP1)이 이 핫픽스는 필요하거나 다른 파일에 대한 종속성을 인해 나중에 MDAC 2.5 SP1에 도입되었습니다. 사용 가능한 MDAC 2.5 직접 적용할 수 없는 수정이 것입니다.

이 핫픽스를 설치하려면 Microsoft Windows 2000 플랫폼에서 (Q273772_W2K_SP2_x86_en.EXE) 핫픽스 설치 관리자 패키지를 실행하십시오. 핫픽스 자체를 플랫폼에 종속적인 것은 아니지만 핫픽스 설치 패키지에 Windows 2000 플랫폼에서만 실행되도록 디자인된 및 Microsoft Windows NT 4.0, Microsoft Windows 95 또는 Microsoft Windows 98 플랫폼에서 실행되지 않습니다. 시스템 파일 보호 파일 MDAC 포함되어 있고 디지털 서명된 핫픽스 설치 관리자가 Windows 2000 의해 해당 파일에 대해서만 바꿀 수 있습니다. 직접 Windows NT 4.0, Windows 95 또는 Windows 98 플랫폼에 해당 파일을 복사할 수 있도록 독립 실행형 핫픽스 파일은 함께 제공됩니다.


해결 방법

이 문제에 대한 해결 방법은 없습니다 있습니다.
현재 상태
Microsoft 문제는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다. 이 문제는 Microsoft 데이터 액세스 구성 요소 2.5 서비스 팩 2 및 Microsoft Windows 2000 서비스 팩 2에서 수정되었습니다.
추가 정보
정기적으로 프로세스 실행하는 동안 프로세스에 대한 메모리 검사합니다 (1048576) 0x100000 점점 더 많은 볼 바이트 할당을. 프로세스를 계속 실행할 경우 프로세스가 결국 메모리가 부족하면 및 응답을 중지 (일시 중단) 또는 실패합니다.

문제를 재현하기 위한 단계

  1. Microsoft Visual C++ 콘솔 응용 프로그램에 뒤에 코드를 복사한 다음 코드를 컴파일하십시오. 데이터 원본 이름, 사용자 ID 및 암호를 변경해야 할 수도 있습니다 유의하십시오.
    #include <windows.h>#include <sql.h>#include <sqlext.h>#include <tchar.h>#include <stdlib.h>#include <stdio.h>#define LEAK_NUMERIC 1		//Use this to determine NUMERIC or BINARY leakvoid HandleError(SQLHANDLE	hHandle, SQLSMALLINT hType, RETCODE RetCode){	SQLSMALLINT	iRec = 0;	SQLINTEGER	iError;	TCHAR		szMessage[1000];	TCHAR		szState[SQL_SQLSTATE_SIZE];	if (RetCode == SQL_INVALID_HANDLE)	{		fprintf(stderr,"Invalid handle!\n");		return;	}	while (SQLGetDiagRec(hType,			 hHandle,			 ++iRec,			 (SQLCHAR *)szState,			 &iError,			 (SQLCHAR *)szMessage,			 (SQLSMALLINT)(sizeof(szMessage) / sizeof(TCHAR)),			 (SQLSMALLINT *)NULL) == SQL_SUCCESS)	{		fprintf(stderr,TEXT("[%5.5s] %s (%d)\n"),szState,szMessage,iError);	}}char* szConnStringIn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=E:\\JetLeak\\TestDatabase.mdb";char* szDropTable = "DROP TABLE LeakTable";//char* szInsertStatement = "INSERT INTO LeakTable VALUES (?)";char* szSelectStatement = "SELECT * FROM LeakTable WHERE val1 = ?";const int nParamCount = 1; #if LEAK_NUMERICchar* szCreateTable = "CREATE TABLE LeakTable (val1 long)";#elsechar* szCreateTable = "CREATE TABLE LeakTable (val1 varchar(10))";#endifvoid main(int argc, char* argv[]){	SQLHENV henv;	SQLHDBC hdbc;	SQLHSTMT hstmt;	SQLRETURN nstatus;	char szConnStringOut[1024];	SQLSMALLINT cbConnOut;	SQLINTEGER status[nParamCount];#if LEAK_NUMERIC	SQLCHAR szParam[nParamCount][10] = {"12345"};#else	BYTE szParam[nParamCount][10] = {0x31,0x33,0x34,0x39};#endif    	//Not checking the return codes in some cases for clarity.		nstatus = SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);	nstatus = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,0);	nstatus = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);	nstatus = SQLDriverConnect(hdbc,			NULL,			(SQLCHAR*) szConnStringIn,			SQL_NTS,			(SQLCHAR*) szConnStringOut,			sizeof (szConnStringOut),			&cbConnOut,			SQL_DRIVER_COMPLETE);								if (nstatus != SQL_SUCCESS && nstatus != SQL_SUCCESS_WITH_INFO)	{		HandleError(hdbc,SQL_HANDLE_DBC,nstatus);		return;	}	nstatus = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);		nstatus = SQLExecDirect(hstmt, (SQLCHAR*) szDropTable, SQL_NTS);	nstatus = SQLExecDirect(hstmt, (SQLCHAR*) szCreateTable, SQL_NTS);	if (!SQL_SUCCEEDED(nstatus))	{		HandleError(hstmt,SQL_HANDLE_STMT,nstatus);	}	int i;	//only one parameter in this case	for (i=0; i < nParamCount; i++)	{		status[i] = SQL_NTS;#if LEAK_NUMERIC		nstatus = SQLBindParameter(hstmt,			i+1,			SQL_PARAM_INPUT,			SQL_C_CHAR,				SQL_NUMERIC, 			10, 			0,			szParam[i],			10,			&status[i]);#else		nstatus = SQLBindParameter(hstmt,			i+1,			SQL_PARAM_INPUT,			SQL_C_BINARY,				SQL_WCHAR,			10, 			0,			szParam[i],			10,			&status[i]);#endif			}	nstatus = SQLPrepare(hstmt,(SQLCHAR*) szSelectStatement, SQL_NTS);	if (nstatus != SQL_SUCCESS)	{		HandleError(hstmt,SQL_HANDLE_STMT,nstatus);	}	for (i=0; i < 100000; i++)	{		if (i % 100 == 0)		{			printf("Selected %d times\n", i);			//printf("Inserted %d records\n", i);			Sleep(100);		}		nstatus = SQLExecute(hstmt);		if (nstatus != SQL_SUCCESS)		{			HandleError(hstmt,SQL_HANDLE_STMT,nstatus);		}		SQLFreeStmt(hstmt, SQL_CLOSE);	}	nstatus = SQLExecDirect(hstmt, (SQLCHAR*) "DELETE FROM LeakTable", SQL_NTS);	if (nstatus != SQL_SUCCESS)	{		HandleError(hstmt,SQL_HANDLE_STMT,nstatus);	}	SQLFreeStmt(hstmt, SQL_CLOSE);	SQLDisconnect(hdbc);}						
    참고: SQL_NUMERIC 또는 SQL_C_BINARY 누수가 보여 주기 위해 LEAK_NUMERIC 상수를 사용할 수 있습니다.
  2. 새 빈 Access 데이터베이스가 지정된 위치에 의해 연결 문자열을 만듭니다.
  3. 해당 코드가 실행 시작하고 성능 모니터를 사용하여 프로세스에 대한 전용 바이트 카운터가 봅니다.

    전용 바이트 카운터가 코드가 실행되는 동안 꾸준히 상승합니다 유의하십시오.
Jet odbc 드라이버 odbcjt32.dll 메모리 누수가 sql_numeric sql_c_binary sqlbindparameter 매개

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 273772 - 마지막 검토: 01/10/2015 12:49:08 - 수정: 2.2

Microsoft Open Database Connectivity Driver for Access 4.0, Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.5 서비스 팩 1

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbbug kbfix kbjet kbmdac250sp2fix kbwin2000presp2fix KB273772 KbMtko
피드백