Al momento sei offline in attesa che la connessione Internet venga ristabilita

FIX: Gestione Driver ODBC erroneamente SQL_NO_DATA_FOUND driver ANSI

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 319243
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Quando si utilizza un driver ODBC ANSI, gestione Driver ODBC potrebbe erroneamente restituire SQL_NO_DATA_FOUND per una colonna definita come VARCHAR o CHAR e che contiene una stringa vuota. Il problema non si verifica Se la colonna contiene alcuni dati o un valore "NULL". Il problema si verifica solo se i dati sono una stringa vuota e associarlo dal lato client con SQL_C_WCHAR.
Cause
Gestione Driver ODBC si presume erroneamente che il driver non dispone di tutti i dati quando tenta di convertire una stringa vuota da ANSI a UNICODE.
Risoluzione
Per risolvere il problema, ottenere il più recente Service pack per Microsoft SQL Server 2000. Per ulteriori informazioni, fare clic su il numero di articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
290211 INF: Come ottenere il Service Pack più recente per SQL Server 2000
Workaround
Una semplice soluzione per questo problema consiste nell'associare la colonna come SQL_C_CHAR anziché SQL_C_WCHAR.
Status
Microsoft ha confermato che questo è un problema nei prodotti Microsoft elencati all'inizio di questo articolo. Questo problema è stato corretto in Microsoft SQL Server 2000 Service Pack 3.
Informazioni
Le applicazioni legacy che utilizzano un driver ODBC ANSI non possono verifica questo problema, perché essi non è possibile associare la colonna come SQL_C_WCHAR. Poiché il Provider Microsoft ODBC .NET associa le colonne di caratteri come SQL_C_WCHAR Per impostazione predefinita, questo problema può verificarsi se si utilizza Microsoft ODBC .NET Provider con un driver ANSI. Si noti che il Provider Microsoft ODBC. Restituisce "NO_DATA" quando si verifica questo problema.

Procedura per riprodurre il comportamento

Nell'esempio nativo riportato di seguito viene illustrato il problema:
  1. Utilizzare lo script seguente per creare una tabella e inserire un disco record:
    Create Table Test (ID integer, COL1 CHAR(10))Insert Into Test VALUES (1,'')					
  2. Eseguire il programma C riportato di seguito:
    #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;}					
    Viene visualizzato il seguente messaggio:
    SQL_NO_DATA_FOUND è stato restituito.
    Premere il tasto INVIO per continuare...
MYSQL

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 319243 - Ultima revisione: 12/07/2015 09:14:20 - Revisione: 7.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtit
Feedback