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

Traduções de Artigos Traduções de Artigos
Artigo: 272951 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Se utilizar o controlador 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 executar instruções que contêm colunas calculadas de um tipo de dados de texto, uma chamada à API de ODBC SQLDescribeCol nas colunas calculadas devolve um tamanho de coluna de 2147483598 (2 GB).

As aplicações que tentam usar o tamanho da coluna devolvido de chamada à API de ODBC SQLDescribeCol , para determinar a quantidade de memória para atribuir a coluna, falhar com "memória esgotada" mensagens de erro.

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

O problema também poderá ocorrer em outros controladores de ODBC do Access.

Para obter mais informações sobre este problema no Windows Vista, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
940895Num computador baseado no Windows Vista, a função de SQLDescribeCol e a função SQLColAttribute devolvem o valor incorrecto de 2147483598 em vez do valor esperado do 255

Causa

Jet devolve um tamanho de coluna de zero para colunas calculadas, que o controlador ODBC Jet interpreta como uma indicação de um tipo de dados longo. Deste modo, o controlador do Jet define o tamanho da coluna para o tamanho máximo permitido para tipos de dados longo, que é 2 GB. No entanto, se o tipo de dados é um tipo de dados de texto (caracteres ou varchar) o tipo ainda será comunicado como SQL_VARCHAR, deve ter um tamanho máximo de 255.

Um exemplo provenientes de um rastreio ODBC segue-se que demonstra o tamanho de coluna 2 GB devolvidos como sétimo argumento (dia 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 este problema, obtenha o service pack mais recente do Microsoft Data Access Components 2.5. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
293312Como obter o service pack mais recente do MDAC 2.5
Se utilizar o controlador de ODBC do Access (Aceodbc.dll) que está incluído no Microsoft Office system de 2007, aplique a correcção 941877 para resolver este problema.

Para obter mais informações sobre a correcção 941877, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
941877Descrição do pacote correcção do Access 2007: 26 de Fevereiro de 2008
A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
NOTA: Esta correcção não está incluído com o Jet SP5 ou o MDAC 2.6. Apesar da correcção deve ser incluída no MDAC 2.5 SP2, sistemas com este problema tem de aplicar a correcção para resolver este problema até que o MDAC 2.5 SP2 é libertada. Além disso, os sistemas que são actualizados directamente a partir do MDAC 2.5 SP1 para o MDAC 2.6 também devem ter esta correcção aplicada.

Como contornar

Em alguns casos, poderá ser possível moldar o campo calculado numa função de conversão de tipo de dados como CInt ou CLong , que converte os resultados para um tipo de dados que não seja texto.

Ponto Da Situação

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

Mais Informação

Este comportamento pode ocorrer com qualquer função que devolve valores calculados, que inclui funções comuns como IIF , máximo , mínimo , FIRST , direita , seg.texto e por aí em diante.

Nota : esta correcção também contém uma correcção para o problema descrito no seguinte artigo da base de dados de conhecimento da Microsoft:
271177CORRECÇÃO: Não é possível reparar a palavra-passe base de dados protegida através do painel de controlo de ODBC

Passos para reproduzir o comportamento

  1. Copie o código que se segue numa aplicação de consola do Microsoft Visual C++ e, em seguida, compilar o código. Por favor note que poderá ter alterar o nome da origem de dados, o ID de utilizador e palavra-passe.
    #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 repare que o tamanho do valor devolvido para a precisão é de 2 GB.

REFERÊNCIAS

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
271177CORRECÇÃO: Não é possível reparar a palavra-passe base de dados protegida através do painel de controlo de ODBC

Propriedades

Artigo: 272951 - Última revisão: 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
  • Controlador 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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