REVISIÓN: Administrador de controladores ODBC informa incorrectamente SQL_NO_DATA_FOUND para el controlador de ANSI

Seleccione idioma Seleccione idioma
Id. de artículo: 319243 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza un controlador de ODBC de ANSI, el Administrador de controladores ODBC puede devolver SQL_NO_DATA_FOUND para una columna que se define como CHAR o VARCHAR y contiene una cadena vacía. No se produce el problema Si la columna contiene algunos datos o un valor "Nulo". El problema sólo ocurre si los datos están una cadena vacía y enlazarla desde el lado del cliente con SQL_C_WCHAR.

Causa

El Administrador de controladores ODBC se supone incorrectamente que el controlador no tiene ningún dato cuando intenta convertir una cadena vacía de ANSI a UNICODE.

Solución

Para resolver este problema, obtenga la última Service pack para Microsoft SQL Server 2000. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211 INF: Cómo obtener el Service Pack más reciente de SQL Server 2000

Solución

Una solución simple para este problema consiste en enlazar la columna como SQL_C_CHAR en lugar de SQL_C_WCHAR.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran al principio de este artículo. Este problema se corrigió por primera vez en Microsoft SQL Server 2000 Service Pack 3.

Más información

Las aplicaciones heredadas que utilizan un controlador ODBC de ANSI, no experimenta este problema, ya que no pueden enlazar la columna como SQL_C_WCHAR. Dado que el proveedor Microsoft ODBC .NET se enlaza las columnas de caracteres como SQL_C_WCHAR de forma predeterminada, puede experimentar este problema si utiliza Microsoft ODBC .NET Proveedor con un controlador de ANSI. Tenga en cuenta que el proveedor ODBC de Microsoft. Devuelve "NO_DATA" cuando se produce este problema.

Pasos para reproducir el comportamiento

En el siguiente ejemplo nativo se muestra el problema:
  1. Utilice la siguiente secuencia de comandos para crear una tabla e insertar uno Registro:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Ejecute el programa de C siguiente:
    #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;
    }
    					
    Recibirá el siguiente mensaje:
    SQL_NO_DATA_FOUND ha devuelto.
    Tecla ENTRAR para continuar...

Propiedades

Id. de artículo: 319243 - Última revisión: viernes, 28 de junio de 2013 - Versión: 7.0
La información de este artículo se refiere a:
  • Microsoft Data Access Components 2.7
Palabras clave: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 319243

Enviar comentarios

 

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