FIX: Il driver ODBC di Microsoft Access o Jet restituisce la dimensione di 2 gigabyte per colonne di testo calcolata

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 272951
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Se si utilizza il driver ODBC Microsoft Access (Jet) (ODBCJT32.dll versione 4.0.5303.1), che viene fornito con Windows 2000 Service Pack (SP) 1, quando si eseguono le istruzioni che includono colonne calcolate di un tipo di dati testo, una chiamata all'API ODBC SQLDescribeCol nelle colonne calcolate restituisce una dimensione di colonna di 2147483598 (2 GB).

Le applicazioni che tentano di utilizzare la dimensione di colonna restituita dalla chiamata all'API ODBC SQLDescribeCol , per determinare la quantità di memoria da allocare per la colonna, non "memoria insufficiente" messaggi di errore.

Versione ODBCJT32.dll 4.0.5303.1 viene installato anche da Data Access Components (MDAC) versione 2.5, Service Pack 1.

Il problema può verificarsi anche in altri driver ODBC di Access.

Per ulteriori informazioni su questo problema in Windows Vista, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
940895In un computer basato su Windows Vista, la funzione SQLDescribeCol e la funzione di SQLColAttribute restituire il valore non corretto di 2147483598 anziché il valore previsto pari a 255
Cause
Jet restituisce una dimensione di colonna pari a zero per le colonne calcolate, il driver Jet ODBC interpreta come indicazione di un tipo di dati Long. Di conseguenza, il driver di Jet, imposta la dimensione della colonna alla dimensione massima consentita per i tipi di dati Long, ovvero 2 GB. Tuttavia, se il tipo di dati è un tipo di dati di testo (carattere o varchar) il tipo ancora viene riportato come SQL_VARCHAR, che deve disporre di una dimensione massima di 255.

Un esempio tratto da un'analisi ODBC seguente che illustra la dimensione restituita della colonna 2 GB come settimo argomento (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)				
Risoluzione
Per risolvere il problema, ottenere il service pack più recente per Microsoft Data Access Components 2.5. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
293312Come ottenere il service pack più recente di MDAC 2.5
Se si utilizza il driver ODBC Access (Aceodbc.dll) incluso in Microsoft Office system 2007, applicare hotfix 941877 per risolvere il problema.

Per ulteriori informazioni sull'aggiornamento rapido (hotfix) 941877, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
941877Descrizione del pacchetto di hotfix per Access 2007: 26 febbraio 2008
La versione inglese di questa correzione deve essere di avere i seguenti attributi di file o versioni successive:
   Date         Version        Size              File name        -----------------------------------------------------------   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll				
Nota: Questo aggiornamento rapido (hotfix) non è incluso con MDAC 2.6 o Jet SP5. Anche se si prevede che la correzione verrà incluso in MDAC 2.5 SP2, è necessario che sistemi di verifica questo problema applicare l'hotfix per risolvere il problema finché non viene rilasciato MDAC 2.5 SP2. Inoltre, i sistemi che vengono aggiornati direttamente da MDAC 2.5 SP1 per MDAC 2.6 inoltre necessario disporre questo hotfix applicato.
Workaround
In alcuni casi, è possibile includere il campo calcolato in una funzione di conversione tipo di dati ad esempio CInt o CLng , che converte i risultati in un tipo di dati non di testo.
Status
Microsoft ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a". Questo problema è stato innanzitutto corretto in Microsoft Data Access Components 2.5 Service Pack 2.
Informazioni
Questo comportamento può verificarsi con qualsiasi funzione che restituisce valori calcolati, che include funzioni comuni come IIF , MAX , MIN , primo , RIGHT , MID e così via.

Nota : questo hotfix contiene anche una correzione per il problema descritta nell'articolo della Microsoft Knowledge Base riportato di seguito:
271177FIX: Impossibile ripristinare il database protetto da password tramite il Pannello di controllo ODBC

Procedura per riprodurre il problema

  1. Copiare il codice che segue in un'applicazione console di Microsoft Visual c ++ e quindi compilare il codice. Potrebbe essere necessario modificare il nome dell'origine dati, ID utente e la password.
    #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. Eseguire il codice e osservare che la dimensione del valore restituito per la precisione è di 2 GB.

RIFERIMENTI

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
271177FIX: Impossibile ripristinare il database protetto da password tramite il Pannello di controllo ODBC
Jet 4.0 sqldescribecol 2 GB gigabyte calcolato colonne calcolate di memoria concatenare mdac25sp1 mdac25 mdac

Proprietà

ID articolo: 272951 - Ultima revisione: 12/05/2015 21:40:21 - Revisione: 5.1

Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.5 Service Pack 1, Driver Microsoft Open Database Connectivity per Access 4.0

  • kbnosurvey kbarchive kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtit
Feedback