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

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
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
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...
MYSQL

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 319243 - Última revisión: 12/07/2015 09:14:19 - Revisión: 7.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtes
Comentarios