Oprava: Správce ovladačů ODBC nesprávně hlásí SQL_NO_DATA_FOUND ovladače ANSI

Překlady článku Překlady článku
ID článku: 319243 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při použití ovladače ANSI ODBC, správce ovladačů ODBC může nesprávně vrátí SQL_NO_DATA_FOUND pro sloupec, který je definován jako VARCHAR nebo CHAR a který obsahuje prázdný řetězec. Tento problém nenastane. Pokud sloupec obsahuje data nebo hodnotu "NULL". Problém nastane, pouze pokud data je prázdný řetězec a navázat jej na straně klienta s SQL_C_WCHAR.

Příčina

Správce ovladačů ODBC nesprávně předpokládá, že ovladač Při pokusu o převod ze standardu ANSI na prázdný řetězec neobsahuje žádná data KÓDOVÁNÍ UNICODE.

Řešení

Tento problém vyřešíte pomocí nejnovější aktualizace Service pack pro Microsoft SQL Server 2000. Další informace získáte klepnutím na na následující číslo článku databáze Microsoft Knowledge Základní:
290211 INF: Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2000

Jak potíže obejít

Jednoduchým řešením tohoto problému je svázat sloupec jako SQL_C_CHAR místo SQL_C_WCHAR.

Prohlášení

Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny na začátku tohoto článku. Tento problém byl poprvé opraven v Microsoft SQL Server 2000 Service Pack 3.

Další informace

Nesmí být starší aplikace, které používají ovladač ANSI ODBC k tomuto problému dojde, protože se nemusí vázat sloupce jako SQL_C_WCHAR. Protože zprostředkovatele ODBC .NET společnosti Microsoft váže znak sloupce jako SQL_C_WCHAR Standardně je tento problém může nastat při použití ODBC rozhraní Microsoft. Zprostředkovatel se ovladač ANSI. Všimněte si, že Microsoft ODBC zprostředkovatele .NET Když nastane tento problém, vrátí "NO_DATA".

Kroky pro reprodukci chování

Následující nativní ukázka znázorňuje problém:
  1. Použít následující skript k vytvoření tabulky a vložení jednoho záznam:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Spuste následující program C:
    #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;
    }
    					
    Zobrazí se následující zpráva:
    Byla vrácena SQL_NO_DATA_FOUND.
    Stisknutím klávesy Enter pokračujte...

Vlastnosti

ID článku: 319243 - Poslední aktualizace: 28. června 2013 - Revize: 7.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Data Access Components 2.7
Klíčová slova: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtcs
Strojově přeložený článek
DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.
Projděte si také anglickou verzi článku: 319243

Dejte nám zpětnou vazbu

 

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