Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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
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:
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:
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...
MYSQL
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.
Eigenschaften

Artikelnummer: 319243 – Letzte Überarbeitung: 07/31/2006 07:44:57 – Revision: 7.0

  • Microsoft Data Access Components 2.7
  • kbdownload kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix KB319243
Feedback