CORRIGER : Gestionnaire de pilotes ODBC signale à tort SQL_NO_DATA_FOUND pilote ANSI

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 319243
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Symptômes
Lorsque vous utilisez un pilote ODBC ANSI, le Gestionnaire de pilotes ODBC peut retourner incorrectement SQL_NO_DATA_FOUND pour une colonne qui est définie en tant que VARCHAR ou CHAR et qui contient une chaîne vide. Le problème ne se produit pas Si la colonne contient des données ou une valeur « NULL ». Le problème se produit uniquement si les données sont une chaîne vide et liez-le à partir du client avec SQL_C_WCHAR.
Cause
Le Gestionnaire de pilotes ODBC suppose à tort que le pilote ne possède pas de données lorsqu'il essaie de convertir la chaîne vide d'ANSI en UNICODE.
Résolution
Pour résoudre ce problème, procurez-vous les dernières versions service pack pour Microsoft SQL Server 2000. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Knowledge Base :
290211 INF: Comment obtenir le dernier Service Pack SQL Server 2000
Contournement
Une solution simple pour résoudre ce problème consiste à lier la colonne en tant que SQL_C_CHAR plutôt que SQL_C_WCHAR.
Statut
Microsoft a confirmé qu'il s'agit d'un problème dans les produits Microsoft répertoriés au début de cet article. Ce problème a été corrigé dans Microsoft SQL Server 2000 Service Pack 3.
Plus d'informations
Les applications héritées qui utilisent un pilote ODBC ANSI ne peuvent pas rencontrer ce problème, car ils ne peuvent pas lier la colonne en tant que SQL_C_WCHAR. Étant donné que le fournisseur Microsoft ODBC .NET lie les colonnes de caractères en tant que SQL_C_WCHAR par défaut, vous pouvez rencontrer ce problème si vous utilisez Microsoft ODBC .NET Fournisseur avec un pilote ANSI. Notez que le fournisseur ODBC de Microsoft .NET Retourne « NO_DATA » lorsque ce problème se produit.

Procédure pour reproduire le comportement

L'échantillon natif suivant illustre le problème :
  1. Utilisez le script suivant pour créer une table et insérez un enregistrement :
    Create Table Test (ID integer, COL1 CHAR(10))Insert Into Test VALUES (1,'')					
  2. Exécutez le programme C suivant :
    #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;}					
    Le message suivant s'affiche :
    SQL_NO_DATA_FOUND a été renvoyé.
    Appuyer sur la touche entrée pour continuer...
MYSQL

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 319243 - Dernière mise à jour : 12/07/2015 09:14:19 - Révision : 7.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtfr
Commentaires