Oprava: Ovladač Microsoft Access nebo Jet ODBC vrátí velikost 2 gigabajty vypočítaný textové sloupce

Překlady článku Překlady článku
ID článku: 272951 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Pokud používáte ovladače ODBC Microsoft Access (Jet) (Odbcjt32.dll verze 4.0.5303.1), který je dodáván s Microsoft Windows 2000 Service Pack (SP) 1, vrátí při spuštění příkazů, které obsahují vypočítaného sloupce typ dat text, volání ODBC API zda na vypočítaného sloupce sloupec velikost 2147483598 (2 GB).

Zkuste použít velikost sloupce vrácená z volání ODBC API zda určit, kolik paměti přidělit pro sloupec, aplikace se nezdaří s "Nedostatek paměti" chybové zprávy.

Podle Data Access Components (MDAC) verze 2.5, Service Pack 1 nainstalována také verze Odbcjt32.dll 4.0.5303.1.

Problém může dojít také v jiných ovladačů ODBC přístup.

Další informace o tomto problému v systému Windows Vista klepněte na následující číslo článku databáze Microsoft Knowledge Base:
940895V počítači se systémem Windows Vista zda funkce a funkce SQLColAttribute vrátí nesprávná hodnota 2147483598 namísto očekávaná hodnota 255

Příčina

Jet vrátí velikost sloupce nula pro vypočítaného sloupce, které ovladač Jet ODBC interpretuje jako označení typ dat Long. Z tohoto důvodu nastaví ovladač Jet maximální povolenou pro typy dat Long, což je 2 GB velikost velikost sloupce. Však Pokud datový typ je typ dat text (znak nebo varchar) typ je stále hlášena jako SQL_VARCHAR, které by měl mít maximální velikost 255.

Příklad převzata z trasování ODBC:, který demonstruje vrácené velikost 2 GB sloupec jako sedmý 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)
				

Řešení

Tento problém vyřešíte pomocí nejnovější aktualizace service pack pro Microsoft Data Access Components 2.5. Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
293312Jak získat nejnovější aktualizaci service pack pro součásti MDAC 2.5
Pokud používáte ovladač Access ODBC (Aceodbc.dll), která je součástí systému Microsoft Office 2007, opravu hotfix 941877 vyřešit tento problém.

Další informace o opravě hotfix 941877 klepnutím na následující číslo článku databáze Microsoft Knowledge Base:
941877Popis balíčku opravy hotfix pro aplikaci Access 2007: 26. února 2008
Anglická verze této opravy má následující nebo vyšší atributy souborů:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
Poznámka: Tato oprava hotfix není zahrnuta s Jet SP5 nebo MDAC 2.6. Ačkoli je očekávána oprava bude zahrnuta v aktualizaci MDAC 2.5 SP2, musí systémy dochází k tomuto problému opravu hotfix Tento problém vyřešit, dokud nebude vydána MDAC 2.5 SP2. Systémy, které jsou inovovány z MDAC 2.5 SP1 MDAC 2.6 dále by měl mít také použita tato oprava hotfix.

Jak potíže obejít

V některých případech může být možné zalomit výpočtové pole datový typ funkci převodu například CInt nebo CLng, která převede výsledky na datový typ text.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt. Tento problém byl poprvé opraven v Microsoft Data Access Components 2.5 Service Pack 2.

Další informace

K tomuto chování může dojít s jakékoli funkce, která vrací vypočítané hodnoty, která zahrnuje běžné funkce jako IIF, MAX, MIN, FIRST, vpravo, MID a tak dále.

Poznámka: Tato oprava hotfix také obsahuje opravu pro problém popsaný v následujícím článku znalostní báze Microsoft Knowledge Base:
271177Oprava: Nelze opravit databázi chráněné heslo prostřednictvím ovládacím ODBC

Kroky pro reprodukci chování

  1. Zkopírujte kód do aplikace Microsoft Visual C++ konzoly následuje a kompilovat kód. Všimněte si, že budete muset změnit zdroj dat název, uživatelské jméno a heslo.
    #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. Spustit kód a Poznámka: velikost pro přesnost vrácená hodnota je 2 GB.

Odkazy

Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
271177Oprava: Nelze opravit databázi chráněné heslo prostřednictvím ovládacím ODBC

Vlastnosti

ID článku: 272951 - Poslední aktualizace: 28. dubna 2008 - Revize: 5.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Ovladač Microsoft Open Database Connectivity pro aplikaci Access 4.0
Klíčová slova: 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:272951

Dejte nám zpětnou vazbu

 

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