CORRECÇÃO: Configuração do atributo de conexão falha quando você usa o pool de conexão para a conexão ODBC para SQL Server

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 822841
Sintomas
Quando você tentar definir um atributo de conexão de um ODBC conexão onde o pool de conexões está ativado usando API de driver de ODBC com o driver ODBC para Microsoft SQL Server, você receber a seguinte mensagem de erro:
IM006 driver [Microsoft] [ODBC Driver Manager] Falha de SQLSetConnectAttr do
Observação A documentação do driver ODBC menciona que a mensagem é uma mensagem informativa. No entanto, você recebe a mensagem como uma mensagem de erro.

Esse problema pode ocorrer quando todas as seguintes condições forem verdadeiras:
  • Você tornar a conexão com um nome de fonte de dados (DSN) usando a API de driver de ODBC de SQLConnect.
  • Uma das propriedades padrão da fonte de dados (como a opção ANSI usar nulos, preenchimentos e avisos ) está desabilitada.
  • Pool de conexões está ativado para o identificador de ambiente.
  • O atributo de nível de isolamento de transação da conexão é definido após abrir a conexão usando SQLConnect.
  • Uma transação de banco de dados é executada.
Como Contornar
Para contornar esse problema, execute estas etapas:
  1. Desativar a opção para o ODBC do pool de conexão conexão.

    Observação Desabilitar o pool de conexão pode afetar o desempenho do seu aplicativo.
  2. Após você confirmar a transação, não ative a opção de confirmação automática.
  3. Defina o nível de isolamento de transação antes de abrir a conexão ODBC.
  4. Usar uma conexão sem DSN em vez de obter o ODBC para conexão com um DSN.
Resolução
Um hotfix suportado está disponível no Microsoft. No entanto, esse hotfix destina-se a corrigir o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico.

Se o hotfix está disponível para download, há uma seção "Download de Hotfix disponível" na parte superior neste artigo da Base de dados de Conhecimento. Se esta seção não for exibido, envie uma solicitação para suporte e atendimento ao cliente Microsoft para obter o hotfix.

Observação Se ocorrerem problemas adicionais ou se qualquer solução de problemas é necessária, talvez você precise criar uma solicitação de serviço separada. Os custos normais de suporte serão aplicados a questões de suporte adicionais e problemas que não se qualificam para esse hotfix específico. Para obter uma lista completa de números de telefone de suporte e Atendimento Microsoft ou para criar uma solicitação de serviço separada, visite o seguinte site: Observação O formulário "Download de Hotfix disponível" exibe os idiomas para os quais o hotfix está disponível. Se você não vir seu idioma, é porque um hotfix não está disponível para esse idioma.A versão em inglês dessa correção apresenta os atributos de arquivo (ou posteriores) listados na tabela a seguir. As datas e horas desses arquivos são listadas na acordo hora universal coordenada (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário na ferramenta Data e hora no painel de controle.
 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     				
Observação Para obter uma lista de todos os hotfixes disponíveis para o MDAC 2.8, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
839801CORRECÇÃO: Hotfixes estão disponíveis para o MDAC 2.8
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".Esse problema foi corrigido no Microsoft Data Access Component 2.7 Service Pack 1 Refresh e Microsoft Data Access Components 2.8.
Mais Informações
Você verá o problema mencionado na "Sintomas" seção deste artigo somente quando você tiver o Microsoft Data Access Component (MDAC) 2.7 Service Pack 1 instalado no computador.

Etapas para reproduzir o comportamento

Use o seguinte código para reproduzir o problema:
// 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);}

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 822841 - Última Revisão: 11/15/2007 14:06:31 - Revisão: 2.5

Microsoft Data Access Components 2.7 Service Pack 1, Microsoft Data Access Components 2.8

  • kbmt kbautohotfix kbhotfixserver kbqfe kberrmsg kbdriver kbtransaction kbfix kbbug KB822841 KbMtpt
Comentários