Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

증상

Microsoft SQL Server ODBC 드라이버와 ODBC 드라이버 API를 사용 하 여 연결 풀링이 활성화 되어 ODBC 연결의 연결 특성을 설정 하려고 하면 다음과 같은 오류 메시지가 나타납니다.

IM006 [Microsoft] [ODBC 드라이버 관리자] 드라이버의 SQLSetConnectAttr을 실패 했습니다.

참고: 정보 메시지는 ODBC 드라이버 설명서를 언급 합니다. 그러나 오류 메시지는 메시지가 나타납니다.

이 문제는 다음 조건에 모두 해당할 경우 발생할 수 있습니다.

  • SQLConnect ODBC 드라이버 API를 사용 하 여 데이터 원본 이름 (DSN)을 사용 하 여 연결을 확인 합니다.

  • Dsn 사용 ANSI null, 안쪽 여백 및 경고 옵션) (예: 기본 속성 중 하나를 사용할 수 없습니다.

  • 환경 핸들과 연결 풀링이 사용 됩니다.

  • SQLConnect를 사용 하 여 연결을 연 후에 연결의 트랜잭션 격리 수준 특성 설정 됩니다.

  • 데이터베이스 트랜잭션이 수행 됩니다.

해결 방법

이 문제를 해결하려면 다음 단계를 수행합니다.

  1. 연결 풀링 ODBC 연결 옵션 사용 안 함

    참고: 연결 풀링을 사용 하지 않으면 응용 프로그램의 성능이 영향을 미칠 수 있습니다.

  2. 사용자가 트랜잭션을 커밋할 후 자동 커밋 옵션을 설정 하지 마십시오.

  3. ODBC 연결을 열기 전에 트랜잭션 격리 수준을 설정 합니다.

  4. DSN 없는 연결을 사용 하 여 DSN에 ODBC 연결을 얻는 것 보다.

해결 방법

지원되는 핫픽스를 Microsoft에서 구할 수 있습니다. 그러나 이 핫픽스는 오직 이 문서에서 설명하는 문제를 해결하는 작업에만 사용됩니다. 이 문제가 발생하는 시스템에만 이 핫픽스를 적용해야 합니다.

핫픽스를 다운로드할 수 있는 경우, 이 기술 자료 문서의 상단에 "핫픽스 다운로드 가능" 섹션이 있습니다. 이 섹션이 표시 되지 않으면 Microsoft 고객 서비스 및 지원 핫픽스를 구하는 요청을 제출 합니다.

참고: 추가 문제가 발생하거나 문제 해결이 필요한 경우, 별도로 서비스를 요청해야 할 수도 있습니다. 추가 지원 질문과 이 특정 핫픽스가 필요하지 않은 문제에는 일반 지원 비용이 적용됩니다. 전체 목록은 Microsoft 고객 서비스 및 지원 전화 번호 또는 별도 서비스 요청을 만들려면, 다음 Microsoft 웹 사이트를 방문 하십시오.

http://support.microsoft.com/contactus/?ws=support참고: "핫픽스 다운로드 사용 가능" 형식은 핫픽스 사용이 가능한 언어를 표시합니다. 사용자 언어가 표시되지 않는 것은 핫픽스를 해당 언어로 사용할 수 없기 때문입니다. 는 영어 버전이이 수정 프로그램의 파일 특성을 가집니다 (이상)은 아래와 같거나 그. 이러한 파일의 시간과 날짜는 협정 세계시 (UTC)에 나열 됩니다. 파일 정보를 볼 때는 로컬 시간으로 변환됩니다. UTC와 로컬 시간의 차이 찾기 위해 사용 하는
제어판의 날짜 및 시간 도구에서 표준 시간대 탭입니다.


MDAC 2.7 SP1

Date Time Version Size File name
--------------------------------------------------------
13-Oct-2002 19:24 90,112 Dahotfix.exe
03-Jul-2003 04:09 2000.81.9031.51 372,736 Sqlsrv32.dll


MDAC 2.8

Date Time Version Size File name
--------------------------------------------------------
31-Mar-2004 16:44 2000.85.1040.0 24,576 Odbcbcp.dll
31-Mar-2004 16:43 2000.85.1040.0 401,408 Sqlsrv32.dll

참고: MDAC 2.8에 사용할 수 있는 모든 핫픽스 목록은 Microsoft 기술 자료의 다음 문서 번호를 클릭 합니다.

839801 수정: 핫픽스 MDAC 2.8에 사용할 수 있는

상태

Microsoft는 "적용 대상" 절에 나열 된 제품의 문제 임을 확인 했습니다. 이 문제는 Microsoft 데이터 액세스 구성 요소 2.8 Microsoft 데이터 액세스 구성 요소 2.7 서비스 팩 1 Refresh에서 수정 되었습니다.

자세한 내용

컴퓨터에 서비스 팩 1 설치 Microsoft 데이터 액세스 구성 요소 (MDAC) 2.7을 사용 하는 경우에이 문서의 "현상" 절에 설명 되어 있는 문제가 표시 됩니다.

동작을 재현 하는

문제를 재현 하려면 다음 코드를 사용 합니다.

// ODBCTestCase.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "sqlext.h"
#include "sql.h"
#include "stdlib.h"

void GetSQLError();
long InitializeEnvironment();
long Connect(BOOL lbUseDSN);
long Disconnect();
int ExecuteProcedure();

SQLHENV ghEnvironment = NULL;
SQLHDBC ghConnection = NULL;
HSTMT ghStatement = NULL;
/**********************************************
* main
**********************************************/
int main(int argc, char* argv[])
{
BOOL lbTransaction = TRUE;
BOOL lbUseDSN = FALSE;
long lValue =0;

if(argc > 1)
{
if(strcmp(argv[1], "DSN") == 0)
lbUseDSN = TRUE;
if(argc > 2)
{
if(strcmp(argv[2], "TRAN") == 0)
lbTransaction = TRUE;
}
}

if(InitializeEnvironment() == 0)
{
for(long llSub = 0; llSub < 2; llSub++)
{
if(Connect(lbUseDSN) == 0)
{

if(lbTransaction)
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);

//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);

ExecuteProcedure();

if(lbTransaction)
{
SQLTransact(ghEnvironment, ghConnection, SQL_COMMIT);

//If you do not call the following, the problem does not occur:
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON);


//If you call the following the problem does not occur:
//SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);
}

Disconnect();
}
}
SQLFreeHandle(SQL_HANDLE_ENV, ghEnvironment);
}

return 0;
}


/**********************************************
* InitializeEnvironment
**********************************************/
long InitializeEnvironment()
{
if (!SQL_SUCCEEDED(SQLSetEnvAttr(NULL,
SQL_ATTR_CONNECTION_POOLING,
(SQLPOINTER)SQL_CP_ONE_PER_DRIVER,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}

if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &ghEnvironment)))
{
GetSQLError();
return 8;
}
if(!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC2, SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
if (!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment,
SQL_ATTR_CP_MATCH,
(SQLPOINTER) SQL_CP_STRICT_MATCH ,
//(SQLPOINTER) SQL_CP_RELAXED_MATCH ,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}

return 0;
}
/**********************************************
* Connect
**********************************************/
long Connect(BOOL lbUseDSN)
{
SQLCHAR lszOutConnectString[1024];
SQLSMALLINT llReturnLength;
SQLAllocHandle(SQL_HANDLE_DBC, ghEnvironment, &ghConnection);

// If you set the isolation before opening the connection, no error reported.
// Customer cannot set this attribute before opening connection because the object
//is running under COM+, and under COM+ isolation levels automatically are set to serializable
//if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
//{
// GetSQLError();
// return 8;
//}

if(lbUseDSN)
{
int iReturn = ::SQLConnect(ghConnection,
(SQLCHAR*)"LocalCPR",
SQL_NTS,
(SQLCHAR*)"sa",
SQL_NTS,
(SQLCHAR*)"password1",
SQL_NTS);
if(!SQL_SUCCEEDED(iReturn))
{
GetSQLError();
return 8;
}
}
else
{
if(!SQL_SUCCEEDED(SQLDriverConnect(ghConnection,
NULL,
(SQLCHAR*)"DSN=LocalCPR;UID=sa;PWD=password1;",
SQL_NTS,
lszOutConnectString,
1024,
&llReturnLength,
SQL_DRIVER_NOPROMPT)))
{
GetSQLError();
return 8;
}
}

SQLAllocStmt(ghConnection, &ghStatement);

//If you set the isolation after you open the connection, you see the problem.
if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
return 0;
}
/**********************************************
* Disconnect
**********************************************/
long Disconnect()
{
if(ghStatement)
{
if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_STMT, ghStatement)))
{
GetSQLError();
return 8;
}
ghStatement = NULL;
}

if(ghConnection)
{
::SQLDisconnect(ghConnection);

if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_DBC, ghConnection)))
{
GetSQLError();
return 8;
}
ghConnection = NULL;
}
return 0;
}
/**********************************************
* ExecuteProcedure
**********************************************/
int ExecuteProcedure()
{
SQLINTEGER mlIndicator = 0;
SQLRETURN lnSqlRetCd = SQL_SUCCESS;
::SQLFreeStmt(ghStatement, SQL_CLOSE);
::SQLFreeStmt(ghStatement, SQL_UNBIND);

/*****************************************************************/
/* Execute Procedure
/*****************************************************************/
RETCODE llDbRetCd = SQLExecDirect(ghStatement, (SQLCHAR*)"SELECT * From Table1", SQL_NTS);
if((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}


/*****************************************************************/
/* Bind return Value
/*****************************************************************/
char lszReturnBuf[300];
SDWORD lSts;

llDbRetCd = SQLBindCol(ghStatement, 1, SQL_C_TCHAR, &lszReturnBuf, 300, &lSts);

if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}


/*****************************************************************/
/* Fetch Result
/*****************************************************************/
llDbRetCd = SQLFetch(ghStatement);
if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}

printf("Output Value : %s\n",lszReturnBuf);
return 0;
}

/**********************************************
* GetSQLError
**********************************************/
void GetSQLError()
{
long llDbErrCd = 0;
short llRetMsgLen = 0;
char lszSqlErrMsg[255];
char lszSqlMsg[255];

SQLError(ghEnvironment,
ghConnection,
ghStatement,
(SQLCHAR*) lszSqlErrMsg,
&llDbErrCd,
(SQLCHAR*) lszSqlMsg,
255,
&llRetMsgLen);
printf(lszSqlErrMsg);
printf(lszSqlMsg);
}

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×