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

Traduzione articoli Traduzione articoli
Identificativo articolo: 272951 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

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

Proprietà

Identificativo articolo: 272951 - Ultima modifica: lunedì 28 aprile 2008 - Revisione: 5.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Driver Microsoft Open Database Connectivity per Access 4.0
Chiavi: 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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