FIX: Microsoft Access/Jet ODBC 驅動程式傳回計算的文字資料行的 2 GB 的大小

文章翻譯 文章翻譯
文章編號: 272951 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

如果您使用 Microsoft Access (Jet) ODBC 驅動程式 (Odbcjt32.dll 版本 4.0.5303.1) 其隨附 Microsoft Windows 2000 Service Pack (預存程序) 1年,當您執行包含計算資料行的文字資料型別,SQLDescribeCol ODBC API,計算資料行上的呼叫的陳述式傳回 2147483598 (2 GB) 的資料行的大小。

嘗試使用從 SQLDescribeCol ODBC API 呼叫傳回的資料行大小來判定為資料行配置多少記憶體的應用程式無法與 「 缺記憶體 」 錯誤訊息。

Microsoft 資料存取元件 (MDAC) 2.5 版,Service Pack 1 也安裝 Odbcjt32.dll 版本 4.0.5303.1。

在其他 Access ODBC 驅動程式,也可能會發生這個問題。

如更多有關這個問題,Windows Vista 中,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
940895在 Windows Vista 電腦上 SQLDescribeCol 函式和 SQLColAttribute 函式傳回 2147483598 而非預期的值為 255 的不正確的值

發生的原因

Jet 會傳回 Jet ODBC 驅動程式會解譯為長整數資料型別表示的計算資料行的零的一資料行大小。有鑑於此,Jet 驅動程式會將資料行大小設定為允許 Long 資料類型也就是 2 GB 的最大大小。不過,如果資料型別是文字資料型別 (字元或 varchar) 型別視為應有的 255 的大小上限的 SQL_VARCHAR 仍然報告。

取自 ODBC 追蹤的範例如下示範傳回 2 GB 資料行大小,作為第七個 (第七) 引數:

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)
				

解決方案

如果要解決這個問題,取得最新的 Service Pack 的 Microsoft 資料存取元件 2.5。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
293312如何取得最新的 MDAC 2.5 Service Pack
如果您使用 Access ODBC 驅動程式 (Aceodbc.dll) 包含在 2007 Microsoft Office System 中,套用 Hotfix 941877 如果要解決這個問題。

如需有關 Hotfix 941877,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
941877Access 2007 Hotfix 套件的描述: 2008 年 2 月 26,
此修正程式的英文版應該具有下列檔案屬性或更新版本:
   Date         Version        Size              File name     
   -----------------------------------------------------------
   08/29/00     4.0.5629.0     270,608 bytes     Odbcjt32.dll
				
注意:此 Hotfix 不包含與 Jet SP5 或 MDAC 2.6。雖然此修正程式應該是隨附於 MDAC 2.5 SP2,發生此問題的系統必須套用 Hotfix 以解決這個問題,直到釋放 MDAC 2.5 SP2。此外,直接從 MDAC 2.5 SP1 升級至 MDAC 2.6 的系統也應該有套用此 Hotfix。

其他可行方案

在某些情況下它可能自動換行資料型別轉換函式,如 CIntCLng,它會將結果轉換為一個非文字資料型別中計算的欄位。

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。 這個問題,首先已經在 Microsoft 資料存取元件 2.5 Service Pack 2 中獲得修正。

其他相關資訊

以任何函數傳回導出的值包括常見的功能類似 IIFMAXMIN向右鍵MID,等等,就會發生這個問題。

注意: 這個 Hotfix 也包含下列 「 Microsoft 知識庫 」 文件所述問題的修正程式:
271177FIX: 無法修復密碼保護的資料庫透過 ODBC 控制台

重現問題的步驟

  1. 複製到 Microsoft Visual C++ 主控台應用程式後面的程式碼,並編譯程式碼。請注意您可能需要變更資料來源名稱、 使用者 ID 和密碼
    #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. 執行程式碼,並注意傳回的整數位數之值的大小為 2 GB。

參考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
271177FIX: 無法修復密碼保護的資料庫透過 ODBC 控制台

屬性

文章編號: 272951 - 上次校閱: 2008年4月28日 - 版次: 5.1
這篇文章中的資訊適用於:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Open Database Connectivity Driver for Access 4.0
關鍵字:?
kbmt kbqfe kbhotfixserver kbbug kbdatabase kbfix kbjet kbmdac250sp2fix kbmdacnosweep KB272951 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:272951
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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