Update: Microsoft Access-Jet ODBC-Treiber gibt die Größe von 2 GB für berechnete Textspalten

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 272951 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Gibt Wenn Sie den Microsoft Access (Jet) ODBC-Treiber (Odbcjt32.dll 4.0.5303.1-Version), die im Lieferumfang von Microsoft Windows 2000 Service Pack (SP) 1 enthalten ist verwenden, wenn Sie Anweisungen ausführen, die berechnete Spalten eines Datentyps Text, einen Aufruf der SQLDescribeCol ODBC-API für berechneten Spalten enthalten eine Spaltengröße zurück 2147483598 (2 GB).

Anwendungen, die aus dem Aufruf der SQLDescribeCol ODBC-API zurückgegebene Spaltengröße verwenden, um wie viel Speicherplatz zum Reservieren für die Spalte zu bestimmen, die mit "Out of Memory" fehlschlagen Fehlermeldungen.

Odbcjt32.dll 4.0.5303.1 Version wird auch von Microsoft Data Access Components (MDAC) Version 2.5, Service Pack 1 installiert.

Das Problem kann auch in anderen Access-ODBC-Treibern auftreten.

Weitere Informationen zu diesem Problem in Windows Vista finden Sie im folgenden Artikel der Microsoft Knowledge Base:
940895Auf einem Windows Vista-basierten Computer SQLDescribeCol-Funktion und die SQLColAttribute-Funktion den falschen Wert zurückgeben von 2147483598 statt des erwarteten Wertes von 255

Ursache

Jet gibt eine Spaltengröße für berechnete Spalten, die der Jet ODBC-Treiber als einen Hinweis auf ein Long-Datentyp interpretiert NULL zurück. Aus diesem Grund wird der Jet-Treiber die Spaltengröße auf die maximal zulässige Größe für Long-Datentypen ist 2 GB. Jedoch Wenn der Datentyp ein Text-Datentyp (Zeichen oder Varchar) ist ist der Typ noch wie SQL_VARCHAR, gemeldet mit eine maximale Größe von 255.

Ein Beispiel für eine ODBC-Ablaufverfolgung entnommen folgt, die die zurückgegebenen 2 GB Spaltengröße als die siebte (7.) Argument veranschaulicht:

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)
				

Lösung

Installieren Sie das neueste Servicepack für Microsoft Data Access Components 2.5, um dieses Problem zu beheben. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
293312Wie Sie das neueste MDAC 2.5 Servicepack erhalten
Wenn Sie den Access ODBC-Treiber (Aceodbc.dll), der in 2007 Microsoft Office System enthalten ist verwenden, wenden Sie Hotfix 941877, um dieses Problem zu beheben an.

Weitere Informationen zu Hotfix 941877 finden Sie im folgenden Artikel der Microsoft Knowledge Base:
941877Beschreibung des Access 2007-Hotfixpakets: 26 Februar 2008
Die englische Version dieses Updates sollte die folgenden Dateiattribute (oder höher) aufweisen:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
Hinweis: Dieser Hotfix ist nicht mit Jet SP5 oder MDAC 2.6 enthalten. Obwohl das Update in MDAC 2.5 SP2 enthalten sein erwartet wird, müssen Systeme, die dieses Problem auftritt den Hotfix zur Behebung dieses Problems bis MDAC 2.5 SP2 freigegeben wird installieren. Darüber hinaus sollten Systeme, die direkt von MDAC 2.5 SP1, um MDAC 2.6 aktualisiert werden auch diesen Hotfix angewendet haben.

Abhilfe

In einigen Fällen kann es möglich, umschließen das berechnete Feld in einer Funktion Datentyp Konvertierung wie CInt oder CLng , die die Ergebnisse in einer nicht-Text-Datentyp konvertiert.

Status

Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind. Dieses Problem wurde erstmals im Microsoft Data Access Components 2.5 Service Pack 2.

Weitere Informationen

Dieses Verhalten kann bei jeder Funktion, die berechnete Werte zurückgibt auftreten, die allgemeine Funktionen wie IIF , MAX , MIN , Erster , RIGHT , Teil und usw. enthält.

Hinweis : dieser Hotfix enthält auch ein Update für die in der folgenden Microsoft Knowledge Base beschriebenen Problem:
271177Update: Nicht reparieren Kennwort geschützte Datenbank über die ODBC-Systemsteuerung

Schritte zum Reproduzieren des Verhaltens

  1. Kopieren Sie den Code, der in eine Microsoft Visual C++-Konsolenanwendung folgt, und kompilieren Sie den Code. Beachten Sie, dass Sie möglicherweise die Datasource Namen, Benutzernamen und Kennwort ändern müssen.
    #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. Führen Sie den Code, und beachten Sie, dass die Größe des für die Genauigkeit zurückgegebene Wert 2 GB ist.

Informationsquellen

Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
271177Update: Nicht reparieren Kennwort geschützte Datenbank über die ODBC-Systemsteuerung

Eigenschaften

Artikel-ID: 272951 - Geändert am: Montag, 28. April 2008 - Version: 5.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Open Database Connectivity-Treiber für Access 4.0
Keywords: 
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 272951
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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