FIX:ODBC 驱动程序管理器针对 ANSI 驱动程序错误地报告 SQL_NO_DATA_FOUND

文章翻译 文章翻译
文章编号: 319243 - 查看本文应用于的产品
本文的发布号曾为 CHS319243
展开全部 | 关闭全部

本文内容

症状

在您使用 ANSI ODBC 驱动程序时,ODBC 驱动程序管理器可能会为定义为 VARCHAR 或 CHAR 并且在其中具有空字符串的列错误地返回 SQL_NO_DATA_FOUND。如果该列包含某些数据或"NULL"值,则不会发生该问题。只有在数据为空字符串并且您从客户端用 SQL_C_WCHAR 绑定它时,才会发生此问题。

原因

ODBC 驱动程序管理器在尝试将空字符串从 ANSI 转换为 UNICODE 时错误地假定该驱动程序不具有任何数据。

解决方案

若要解决此问题,请下载 Q319243_MDAC27_x86.exe 修补程序。以下文件可以从 Microsoft 下载中心下载:
收起这个图片展开这个图片
下载
立即下载 Q319243_MDAC27_x86.exe
发布日期:2002 年 7 月 12 日

有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 How to Obtain Microsoft Support Files from Online Services(如何从联机服务获取 Microsoft 支持文件)
Microsoft 已对此文件进行了病毒扫描。在发表当日 Microsoft 使用了最新的病毒检测软件以扫描此文件是否有病毒。此文件保存在安全服务器上,以防对它进行任何未经授权的更改。

有关此修补程序的更多信息,请访问下面的 Microsoft Web 站点:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=6263FCF4-A2AD-4690-8F6D-3341C16B31E6

替代方法

解决此问题的一个简单方法是将该列绑定为 SQL_C_CHAR,而不是 SQL_C_WCHAR。

状态

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题。

更多信息

使用 ANSI ODBC 驱动程序的旧式应用程序可能不会遇到此问题,因为它们可能无法将该列绑定为 SQL_C_WCHAR。因为 Microsoft ODBC .NET 提供程序默认情况下将字符列绑定为 SQL_C_WCHAR,所以,如果您将 Microsoft ODBC .NET 提供程序与 ANSI 驱动程序一起使用,则可能会遇到此问题。请注意,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 has been returned.
    Press Enter key to continue...

属性

文章编号: 319243 - 最后修改: 2006年7月31日 - 修订: 5.0
这篇文章中的信息适用于:
  • Microsoft Data Access Components 2.7
关键字:?
kbdownload kbbug kbfix KB319243
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