CORRECTIF : Pilote Microsoft Access/Jet ODBC retourne la taille de 2 gigaoctets pour les colonnes de texte calculée

Traductions disponibles Traductions disponibles
Numéro d'article: 272951 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Si vous utilisez le pilote ODBC Microsoft Access (Jet) (Odbcjt32.dll version 4.0.5303.1), qui est livré avec Microsoft Windows 2000 Service Pack (SP) 1, lorsque vous exécutez les instructions qui contiennent des colonnes calculées d'un type de données texte, un appel à l'API de ODBC SQLDescribeCol sur des colonnes calculées retourne une taille de colonne de 2147483598 (2 Go).

Les applications qui essaient d'utiliser la taille de la colonne renvoyée à partir de l'appel à l'API de ODBC SQLDescribeCol, pour déterminer la quantité de mémoire à allouer pour la colonne, échouent avec "mémoire insuffisante" messages d'erreur.

Version du fichier Odbcjt32.dll 4.0.5303.1 est également installée par Microsoft Data Access Components (MDAC) version 2.5, Service Pack 1.

Le problème peut également se produire dans les autres pilotes Access ODBC.

Pour plus d'informations sur ce problème dans Windows Vista, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
940895Sur un ordinateur Windows Vista, la fonction SQLDescribeCol et la fonction SQLColAttribute renvoient la valeur incorrecte de 2147483598 au lieu de la valeur attendue de 255

Cause

Jet retourne une taille de colonne égale à zéro pour les colonnes calculées, le pilote Jet ODBC interprète comme une indication sur un type de données long. Par conséquent, le pilote Jet définit la taille de la colonne sur la taille maximale autorisée pour les types de données long, qui est de 2 Go. Cependant, si le type de données est un type de données texte (caractère ou varchar) le type est toujours signalé comme SQL_VARCHAR, qui doit avoir une taille maximale de 255.

Voici un exemple prélevé sur une trace ODBC : qui montre la taille de la colonne 2 Go retourné en tant que septième argument (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)
				

Résolution

Pour résoudre ce problème, procurez-vous le dernier service pack Microsoft Data Access Components 2.5. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
293312Comment faire pour obtenir la dernière pack de service MDAC 2.5
Si vous utilisez le pilote Access ODBC (Aceodbc.dll) qui est inclus dans Microsoft Office system 2007, appliquez le correctif 941877 pour résoudre ce problème.

Pour plus d'informations sur le correctif 941877, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
941877Description du package de correctifs pour Access 2007 daté du : 26 février 2008
La version anglaise de ce correctif doit avoir les attributs de fichier suivants ou ceux d'une version ultérieure :
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
Remarque : Ce correctif n'est pas inclus avec Jet SP5 ou MDAC 2.6. Bien que le correctif doit être inclus dans MDAC 2.5 SP2, les systèmes rencontrant ce problème doivent appliquer le correctif pour résoudre ce problème jusqu'à la publication de MDAC 2.5 SP2. En outre, les systèmes qui sont mis à niveau directement à partir de MDAC 2.5 SP1 MDAC 2.6 doivent également avoir ce correctif appliqué.

Contournement

Dans certains cas, il est possible d'encapsuler le champ calculé dans une fonction de conversion de type de données telles que CInt ou CLng, qui convertit les résultats à un type de données non textuelles.

Statut

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section "S'applique à". Ce problème a été corrigé dans Microsoft Data Access Components 2.5 Service Pack 2.

Plus d'informations

Ce problème peut se produire avec toute fonction qui renvoie des valeurs calculées, qui inclut des fonctions courantes telles que IIF, MAX, MIN, FIRST, RIGHT, MID et ainsi de suite.

Remarque : ce correctif contient également un correctif de problème décrit dans l'article de base de connaissances Microsoft suivant :
271177CORRECTIF : Impossible de réparer la base de données protégée de mots de passe par le biais du Panneau de configuration ODBC

Procédure pour reproduire le comportement

  1. Copiez le code qui suit dans une application de console Microsoft Visual C++ et ensuite compiler le code. Veuillez Notez que vous devrez peut-être modifier le nom de la source de données, le nom d'utilisateur et le mot de 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. Exécutez le code et notez que la taille de la valeur renvoyée pour la précision est 2 Go.

RÉFÉRENCES

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
271177CORRECTIF : Impossible de réparer la base de données protégée de mots de passe par le biais du Panneau de configuration ODBC

Propriétés

Numéro d'article: 272951 - Dernière mise à jour: lundi 28 avril 2008 - Version: 5.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Pilote ODBC pour Access 4.0 de Microsoft
Mots-clés : 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 272951
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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