CORREÇÃO: O Gerenciador de Driver ODBC relata incorretamente SQL_NO_DATA_FOUND driver ANSI

Traduções deste artigo Traduções deste artigo
ID do artigo: 319243 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando você usa um driver de ODBC ANSI, o Gerenciador de Driver ODBC pode retornar incorretamente SQL_NO_DATA_FOUND para uma coluna é definida como VARCHAR ou CHAR e que tem uma seqüência vazia. O problema não ocorre. Se a coluna contém alguns dados ou um valor "Nulo". O problema ocorre apenas se os dados são uma seqüência vazia e vinculá-lo do lado do cliente com SQL_C_WCHAR.

Causa

O Gerenciador de Driver ODBC incorretamente pressupõe que o driver não tem todos os dados quando ele tenta converter a cadeia de caracteres vazia de ANSI para UNICODE.

Resolução

Para resolver esse problema, obtenha o mais recente Service pack para Microsoft SQL Server 2000. Para obter informações adicionais, clique em no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
290211 INF: Como obter o Service Pack mais recente do SQL Server 2000

Como Contornar

Uma solução simples para esse problema é acoplar a coluna como SQL_C_CHAR em vez de SQL_C_WCHAR.

Situação

Microsoft confirmou que este é um problema nos produtos Microsoft que estão listados no início deste artigo. Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 3.

Mais Informações

Os aplicativos herdados que usam um driver de ODBC ANSI não pode enfrentar esse problema, porque eles não podem ligar a coluna como SQL_C_WCHAR. Porque o provedor de ODBC do Microsoft .NET vincula-se colunas de caracteres como SQL_C_WCHAR Por padrão, você pode enfrentar esse problema se você usar o ODBC do Microsoft .NET Provedor com um driver ANSI. Observe que o provedor de ODBC do Microsoft .NET Retorna "NO_DATA" quando esse problema ocorre.

Passos para reproduzir o comportamento

O exemplo a seguir nativo demonstra o problema:
  1. Use o seguinte script para criar uma tabela e insira um disco Registro:
    Create Table Test (ID integer, COL1 CHAR(10))
    Insert Into Test VALUES (1,'')
    					
  2. Execute o seguinte programa em 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;
    }
    					
    Você recebe a seguinte mensagem:
    SQL_NO_DATA_FOUND foi retornado.
    Pressione a tecla Enter para continuar...

Propriedades

ID do artigo: 319243 - Última revisão: sexta-feira, 28 de junho de 2013 - Revisão: 7.0
A informação contida neste artigo aplica-se a:
  • Microsoft Data Access Components 2.7
Palavras-chave: 
kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.
Clique aqui para ver a versão em Inglês deste artigo: 319243

Submeter comentários

 

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