修正: ODBC 驅動程式管理員無法正確報告 SQL_NO_DATA_FOUND ANSI 驅動程式

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:319243
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
當您使用 ANSI ODBC 驅動程式,ODBC 驅動程式管理員不正確可能會傳回資料行定義為 SQL_NO_DATA_FOUNDVARCHAR 或 CHAR 且中具有一個空字串。沒有發生問題如果欄位中包含一些資料或"NULL"值。如果,才會發生這個問題資料為空字串,並在您從用戶端與繫結SQL_C_WCHAR。
發生的原因
不正確的 ODBC 驅動程式管理員會假設,驅動程式嘗試轉換為 ANSI 則為空字串時並未包含任何資料UNICODE。
解決方案
若要解決這個問題,請取得最新版的Microsoft SQL Server 2000 套用此 hotfix。如需詳細資訊,請按一下下面的文件編號,檢視微軟知識庫中基礎:
290211 資訊: 如何取得最新的 SQL Server 2000 Service Pack
其他可行方案
此問題的簡單的解決辦法是將繫結資料行為 SQL_C_CHAR,而不是 SQL_C_WCHAR。
狀況說明
Microsoft已確認這是在 Microsoft 產品中所列的問題這份文件的開頭。 在 Microsoft SQL Server 中第一次校正過這個問題2000 Service Pack 3。
其他相關資訊
使用 ANSI ODBC 驅動程式的舊版應用程式可能不會遇到這個問題,因為它們可能不會繫結做 SQL_C_WCHAR 的資料行。因為 Microsoft ODBC.NET 提供者將字元資料行繫結為 SQL_C_WCHAR預設情況下,您可能會遇到這個問題如果您使用 Microsoft 的 ODBC.NETANSI 的驅動程式的提供者。請注意,Microsoft ODBC.NET 提供者發生這個問題時,則傳回"NO_DATA"。

如果要重現問題的步驟

下列原生範例將示範這個問題:
  1. 使用下列的指令碼來建立資料表,然後插入磁碟記錄:
    Create Table Test (ID integer, COL1 CHAR(10))Insert Into Test VALUES (1,'')					
  2. 執行下列的 C 程式:
    #include <windows.h>#include <stdio.h>#include <sql.h>#include <sqlext.h>int main(int argc, char* argv[]){	SQLCHAR*	theDiagState = new SQLCHAR[50];	SQLINTEGER	theNativeState;	SQLCHAR*	theMessageText  = new SQLCHAR[255];	SQLSMALLINT	iOutputNo;	SQLHENV		m_SQLEnvironment;	SQLHDBC		m_SQLConnection;	SQLHSTMT	m_SQLStatement;	SQLRETURN	iReturn;	long		lStrLen;	char		theData[1000];	//Connect.	iReturn = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_SQLEnvironment);	iReturn = SQLSetEnvAttr(m_SQLEnvironment,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,0);	iReturn = SQLAllocHandle(SQL_HANDLE_DBC,m_SQLEnvironment,&m_SQLConnection);	//CHANGE THE DSN NAME HERE.	char	szConnBuffer[1024];	short   cbOutConn;	char    szConnStr[255];         strcpy(szConnStr,"DSN=YourANSIDSN;UID=YorUid;Pwd=YourPassword");		iReturn= SQLDriverConnect(m_SQLConnection, NULL,(SQLTCHAR*) szConnStr,strlen(szConnStr), (SQLCHAR*) szConnBuffer,1024, &cbOutConn, SQL_DRIVER_NOPROMPT);	if (iReturn != SQL_SUCCESS)	{		SQLGetDiagRec(SQL_HANDLE_DBC,m_SQLConnection,1,theDiagState,&theNativeState,theMessageText,100,&iOutputNo);	}	//Run query.	iReturn = SQLAllocHandle(SQL_HANDLE_STMT,m_SQLConnection,&m_SQLStatement);	//The Test table contains COL1 column which is set to empty for the first record.	iReturn = SQLExecDirect(m_SQLStatement, (SQLCHAR*) "Select ID,COL1 FROM Test",SQL_NTS);	iReturn = SQLFetch(m_SQLStatement);	iReturn = SQLGetData(m_SQLStatement,2,SQL_C_WCHAR,theData,100,&lStrLen);	//The problem does not occur if you bind the same column to SQL_C_CHAR.	//iReturn = SQLGetData(m_SQLStatement,2,SQL_C_CHAR,theData,100,&lStrLen);	if (iReturn != SQL_SUCCESS)	{		//iReturn will be 100 SQL_NO_DATA_FOUND here with NO other message.		int CheckHere;		CheckHere = 0;  //It will come here.		if (iReturn == SQL_NO_DATA_FOUND)		{			printf("SQL_NO_DATA_FOUND has been returned.\n Press Enter key to continue...\n");			getchar();		}			}	//DISCONNECT.	iReturn = SQLFreeHandle(SQL_HANDLE_STMT,m_SQLStatement);	iReturn = SQLDisconnect(m_SQLConnection);	iReturn = SQLFreeHandle(SQL_HANDLE_DBC,m_SQLConnection);	iReturn = SQLFreeHandle(SQL_HANDLE_ENV,m_SQLEnvironment);	m_SQLStatement = NULL;	m_SQLConnection = NULL;	m_SQLEnvironment = NULL;	delete theMessageText; 	delete theDiagState;	return 1;}					
    您會收到下列訊息:
    SQL_NO_DATA_FOUND 已回復。
    按下 Enter 鍵繼續...
MYSQL

警告:本文為自動翻譯

內容

文章識別碼:319243 - 最後檢閱時間:12/07/2015 09:14:25 - 修訂: 7.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbHotfixServer kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtzh
意見反應