FIX: ODBC-Treibermanager meldet fälschlicherweise "SQL_NO_DATA_FOUND" für ANSI-Treiber

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 319243 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
319243 FIX: ODBC Driver Manager Incorrectly Reports SQL_NO_DATA_FOUND for ANSI Driver
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie einen ANSI-ODBC-Treiber verwenden, meldet der ODBC-Treibermanager möglicherweise "SQL_NO_DATA_FOUND" bei einer Spalte, die als "VARCHAR" oder "CHAR" definiert ist und eine leere Zeichenfolge enthält. Das Problem tritt nicht auf, wenn die Spalte Daten oder den Wert "NULL" enthält. Das Problem tritt nur dann auf, wenn es sich bei den Daten um eine leere Zeichenfolge handelt und sie von der Clientseite aus mittels "SQL_C_WCHAR" gebunden werden.

Ursache

Der ODBC-Treibermanager nimmt beim Versuch, die leere Zeichenfolge von ANSI nach UNICODE zu konvertieren, fälschlicherweise an, dass der Treiber keine Daten erhalten hat.

Lösung

Installieren Sie das neueste Service Pack für Microsoft SQL Server 2000, um dieses Problem zu beheben. Weitere Informationen finden Sie in folgendem Artikel der Microsoft Knowledge Base:
290211 INF: How to Obtain the Latest SQL Server 2000 Service Pack
Downloaden Sie den Patch "Q319243_MDAC27_x86.exe", um dieses Problem zu beheben. Die folgende Datei steht im Microsoft Download Center zum Download zur Verfügung:
Bild minimierenBild vergrößern
Download
Q319243_MDAC27_x86.exe jetzt downloaden
Datum der Veröffentlichung: 12. Juli 2002

Weitere Informationen über das Downloaden von Microsoft Support-Dateien finden Sie in folgendem Artikel der Microsoft Knowledge Base:
119591 So erhalten Sie Microsoft Support-Dateien im Internet
Microsoft hat diese Datei auf Viren überprüft. Microsoft hat dazu die neueste Software zur Virenerkennung verwendet, die zum Zeitpunkt der Bereitstellung verfügbar war. Nach der Bereitstellung befindet sich die Datei auf Servern mit verstärkter Sicherheit, wodurch nicht autorisierte Änderungen an der Datei weitestgehend verhindert werden. Weitere Informationen zu diesem Patch finden Sie auf folgender Website von Microsoft:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=6263FCF4-A2AD-4690-8F6D-3341C16B31E6

Abhilfe

Eine einfache Möglichkeit, dieses Problem zu umgehen, ist das Binden der Spalte als "SQL_C_CHAR" anstatt als "SQL_C_WCHAR".

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt. Dieses Problem wurde erstmals in Microsoft SQL Server 2000 Service Pack 3 behoben.

Weitere Informationen

Bei älteren Anwendungen, die einen ANSI-ODBC-Treiber verwenden, tritt das Problem möglicherweise nicht auf, da sie die Spalte möglicherweise nicht als "SQL_C_WCHAR" binden. Da Microsoft ODBC .NET Provider Spalten mit Zeicheninformationen standardmäßig als "SQL_C_WCHAR" bindet, tritt dieses Problem möglicherweise auf, wenn Sie Microsoft ODBC .NET Provider mit einem ANSI-Treiber verwenden. Beachten Sie, dass Microsoft ODBC .NET Provider "NO_DATA" zurückgibt, wenn dieses Problem auftritt.

Schritte zum Reproduzieren des Verhaltens

Das folgende Beispiel veranschaulicht das Problem:
  1. Verwenden Sie das folgende Skript, um eine Tabelle anzulegen und einen Datensatz einzufügen:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Führen Sie das folgende C-Programm aus:
    #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;
    }
    					
    Die folgende Meldung wird angezeigt:
    SQL_NO_DATA_FOUND has been returned.
    Press Enter key to continue...

Eigenschaften

Artikel-ID: 319243 - Geändert am: Montag, 31. Juli 2006 - Version: 7.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Data Access Components 2.7
Keywords: 
kbdownload kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix KB319243
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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