REVISIÓN: Controlador ODBC de Microsoft Access o Jet devuelve el tamaño de 2 gigabytes para las columnas calculadas de texto

Seleccione idioma Seleccione idioma
Id. de artículo: 272951 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Si utiliza el controlador ODBC Microsoft Access (Jet) (Odbcjt32.dll versión 4.0.5303.1), que se incluye con Windows 2000 Service Pack (SP) 1, al ejecutar las instrucciones que contienen columnas calculadas de un tipo de datos de texto, una llamada a la API de ODBC SQLDescribeCol en columnas calculadas devuelve un tamaño de columna de 2147483598 (2 GB).

Las aplicaciones que intente utilizar el tamaño de columna devuelto de la llamada a la API de ODBC SQLDescribeCol para determinar cuánta memoria para asignar la columna errores con "memoria insuficiente" mensajes de error.

Data Access Components (MDAC) versión 2.5, Service Pack 1 instala también la versión de ODBCJT32.dll 4.0.5303.1.

El problema puede producirse también en otros controladores ODBC de Access.

Para obtener más información acerca de este problema en Windows Vista, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
940895En un equipo basado en Windows Vista, la función SQLDescribeCol y la función SQLColAttribute de devuelven el valor incorrecto de 2147483598 en lugar del valor esperado de 255

Causa

Jet devuelve un tamaño de columna de cero para las columnas calculadas, el controlador ODBC de Jet se interpreta como una indicación de un tipo de datos Long. A causa de esto, el controlador Jet establece el tamaño de columna hasta el tamaño máximo permitido para tipos de datos Long, que es de 2 GB. Sin embargo, si el tipo de datos es un tipo de datos de texto (caracteres o varchar) el tipo todavía se notifica como SQL_VARCHAR, que debe tener un tamaño máximo de 255.

Un ejemplo tomado de una traza ODBC: que se muestra el tamaño devuelto de la columna de 2 GB como séptimo 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)
				

Solución

Para resolver este problema, obtenga el service pack más reciente para Microsoft Data Access Components 2.5. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
293312Cómo obtener el Service Pack más reciente de MDAC 2.5
Si utiliza el controlador ODBC de Access (Aceodbc.dll) que se incluye en 2007 Microsoft Office system, aplicar revisión 941877 para resolver este problema.

Para obtener más información acerca de revisión 941877, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
941877Descripción del paquete revisión de Access 2007: 26 de febrero de 2008
La versión en inglés de esta revisión debe tener los atributos de archivo siguientes o posteriores:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
Nota: Esta revisión no se incluye con MDAC 2.6 o SP5 de Jet. Aunque se espera que la revisión se incluya con MDAC 2.5 Service Pack 2, los sistemas que presenten este problema deben aplicar la revisión para resolver este problema hasta que se publique MDAC 2.5 Service Pack 2. Además, los sistemas que se actualizan directamente desde MDAC 2.5 Service Pack 1 para MDAC 2.6 también deben tener aplicada esta revisión.

Solución

En algunos casos, es posible ajustar el campo calculado en una función de conversión de tipo de datos, como CInt o CLng , que convierte los resultados en un tipo de datos que no sean de texto.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:". Este problema se corrigió por primera vez en Microsoft Data Access Components 2.5 Service Pack 2.

Más información

Este comportamiento puede producirse con cualquier función que devuelve valores calculados, que incluye las funciones comunes como IIF , MAX , MIN , FIRST , RIGHT , MID y así sucesivamente.

Nota : esta revisión también contiene una solución para el problema descrito en el siguiente artículo de Knowledge Base:
271177REVISIÓN: No se puede reparar la base de datos protegida de contraseñas a través del panel de control ODBC

Pasos para reproducir este comportamiento

  1. Copie el código que sigue en una aplicación de consola de Microsoft Visual C++ y, a continuación, compile el código. Por favor, tenga en cuenta que puede necesitar cambiar el nombre de origen de datos, el identificador de usuario y la contraseña.
    #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. Ejecute el código y tenga en cuenta que el tamaño del valor devuelto para la precisión es 2 GB.

REFERENCIAS

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
271177REVISIÓN: No se puede reparar la base de datos protegida de contraseñas a través del panel de control ODBC

Propiedades

Id. de artículo: 272951 - Última revisión: lunes, 28 de abril de 2008 - Versión: 5.1
La información de este artículo se refiere a:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Open Database Connectivity Driver for Access 4.0
Palabras clave: 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 272951

Enviar comentarios

 

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