CORRECÇÃO: O driver de ODBC do Microsoft Access/Jet retorna o tamanho de 2 gigabytes para colunas de texto calculada

Traduções deste artigo Traduções deste artigo
ID do artigo: 272951 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Se você usar o driver ODBC do Microsoft Access (Jet) (Odbcjt32.dll versão 4.0.5303.1), que é fornecido com o Microsoft Windows 2000 Service Pack (SP) 1, quando você executa instruções que contêm colunas computadas de um tipo de dados texto, uma chamada para a API de ODBC SQLDescribeCol em colunas computadas retornará um tamanho de coluna de 2147483598 (2 GB).

Aplicativos que tentam usar o tamanho da coluna retornado da chamada para a API de ODBC SQLDescribeCol , para determinar quanta memória para alocar para a coluna, falham com "sem memória" mensagens de erro.

Versão Odbcjt32.dll 4.0.5303.1 também é instalado pelo Microsoft Data Access Components (MDAC) versão 2.5, Service Pack 1.

O problema também pode ocorrer em outros drivers de ODBC do Access.

Para obter mais informações sobre este problema no Windows Vista, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
940895Em um computador baseado no Windows Vista, a função SQLDescribeCol e a função SQLColAttribute retornam o valor incorreto de 2147483598 em vez do valor esperado de 255

Causa

Jet retorna um tamanho de coluna de zero para colunas calculadas, que o driver ODBC Jet interpreta como uma indicação de um tipo de dados Long. Devido a isso, o driver de Jet define o tamanho coluna até o tamanho máximo permitido para tipos de dados Long, que é de 2 GB. No entanto, se o tipo de dados é um tipo de dados texto (caractere ou varchar) o tipo ainda é relatado como SQL_VARCHAR, que deve ter um tamanho máximo de 255.

Segue um exemplo extraído de um rastreamento de ODBC que demonstra o tamanho retornado da coluna 2 GB como sétimo argumento (7):

mdactest        65c-698	EXIT  SQLDescribeCol  with return code 0 (SQL_SUCCESS)
		HSTMT               01EC18D8
		UWORD                        2 
		UCHAR *             0x0012FAE4 [       8] "Expr1001"
		SWORD                      129 
		SWORD *             0x0012FA94 (8)
		SWORD *             0x0012FA86 (12)
		SQLULEN *           0x0012FA98 (2147483598)
		SWORD *             0x0012FA9C (0)
		SWORD *             0x0012FA9E (1)
				

Resolução

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft Data Access Components 2.5. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
293312Como obter o service pack mais recente do MDAC 2.5
Se você usar o driver ODBC do Access (Aceodbc.dll) incluída no 2007 Microsoft Office system, aplique o hotfix 941877 para resolver esse problema.

Para obter mais informações sobre o hotfix 941877, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
941877Descrição do hotfix do Access 2007: 26 de fevereiro de 2008
A versão em inglês dessa correção deve ter os seguintes atributos de arquivo ou posteriores:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
Observação: Esse hotfix não está incluído com o Jet SP5 ou o MDAC 2.6. Embora a correção deve ser incluído no MDAC 2.5 SP2, sistemas com esse problema devem aplicar o hotfix para resolver esse problema até que o MDAC 2.5 SP2 é liberada. Além disso, os sistemas que são atualizados diretamente do MDAC 2.5 SP1 para o MDAC 2.6 também devem ter este hotfix aplicado.

Como Contornar

Em alguns casos, talvez seja possível encapsular o campo calculado em uma função de conversão de tipo de dados, como CInt ou CLng , que converte os resultados para um tipo de dados não-texto.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a". Esse problema foi corrigido primeiro no Microsoft Data Access Components 2.5 Service Pack 2.

Mais Informações

Esse comportamento pode ocorrer com qualquer função que retorna valores calculados, que inclui funções comuns como IIF , máximo , mínimo , primeiro , RIGHT , MID e assim por diante.

Observação : esse hotfix também contém uma correção para o problema descrito no artigo seguinte da Base de dados de Conhecimento da Microsoft:
271177CORRECÇÃO: Não é possível reparar o banco de dados protegido de senha por meio do painel de controle do ODBC

Etapas para reproduzir o comportamento

  1. Copie o código a seguir em um aplicativo de console do Microsoft Visual C++ e, em seguida, compile o código. Por favor Observe que talvez seja necessário alterar o nome de fonte de dados, identificação de usuário e a senha.
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #include <sql.h>
    #include <sqlext.h>
    
    
    void ShowErrors(HDBC, HSTMT);
    
    
    void main(void)
    {
    
    	SQLHANDLE henv;
    	SQLHANDLE hdbc;
    	SQLHANDLE hstmt;
    	
    	RETCODE rc = 0;
    	
    	SQLCHAR Statement[50] = "Select IIF('A' = 'A', 'Y', 'N') from shippers";	
    
    	SQLCHAR dsn[15] = "northwind2000";
    	SQLCHAR user[6] = "admin";
    	SQLCHAR pass[5] = "";
    	long sqlnts = -3;
    	
    //	variables for SQLDescribeCol
    	char  m_colname[20] = {"\0"};
    	short m_colsize = 0;
    	short m_sqltype = 0;
    	unsigned long m_prec = 0;
    	short m_scale = 0;
    	short m_nullable = 0;
    	
    
    
    	rc = SQLAllocEnv(&henv);
    	
    	rc = SQLAllocConnect(henv, &hdbc);
    	
    	rc = SQLConnect(hdbc, dsn, SQL_NTS, (SQLCHAR *) user, SQL_NTS, (SQLCHAR *) pass, SQL_NTS);
    	if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO))
    		ShowErrors(hdbc, NULL);
    	rc = SQLAllocStmt(hdbc, &hstmt);
    
    	rc = SQLExecDirect(hstmt, Statement, SQL_NTS);
    	if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO))
    		ShowErrors(NULL, hstmt);
    
    	rc = SQLDescribeCol(hstmt, 1, (unsigned char *)m_colname, 20, &m_colsize, &m_sqltype, &m_prec, &m_scale, &m_nullable);
    
    	printf("Size returned from SQLDescribeCol is:\t%d", m_prec);
    
    	SQLFreeStmt(hstmt, SQL_CLOSE);
    	SQLDisconnect(hdbc);
    	SQLFreeConnect(hdbc);
    	SQLFreeEnv(henv);
    }
    
    
    void ShowErrors (HDBC hdbc, HSTMT hstmt)
    {
    
    //	Variables for SQLGetDiagRec
    	SQLCHAR sqlState[20];
    	SQLCHAR errorMsg[1000];
    	SQLSMALLINT errorMsgLen;
    	SQLINTEGER nativeError;
    	char szTemp[4096];
    	
    	
    //	Retrieve the Raised error message
    	if (hdbc!= NULL) 
    		SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,sqlState,
    			&nativeError,errorMsg,1000,&errorMsgLen);
    	else
    		SQLGetDiagRec(SQL_HANDLE_STMT,hstmt,1,sqlState,
    			&nativeError,errorMsg,1000,&errorMsgLen);
    
    //	Display the size of the returned error message, and the message itself
    	sprintf(szTemp, "Length=[%d] Text=%s", strlen((char*)errorMsg), errorMsg );
    	printf("ERROR!  %s\n\n\n", szTemp);
    
    	printf("Press any key to exit...");
    	getchar();
    
    	if (hstmt != NULL)
    	{
    		SQLFreeStmt(hstmt, SQL_CLOSE);
    		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    	}
    	SQLDisconnect(hdbc);
    	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    
    	exit(0);
    
    
    }
    					
  2. Executar o código e observe que o tamanho do valor retornado para a precisão é 2 GB.

REFERÊNCIAS

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
271177CORRECÇÃO: Não é possível reparar o banco de dados protegido de senha por meio do painel de controle do ODBC

Propriedades

ID do artigo: 272951 - Última revisão: segunda-feira, 28 de abril de 2008 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Driver Microsoft Open Database Connectivity para Access 4.0
Palavras-chave: 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtpt
Tradução automática
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: 272951

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com