CORRECÇÃO: Gestor do controlador ODBC comunica incorrectamente SQL_NO_DATA_FOUND para controlador de ANSI

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 319243
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Sintomas
Quando utiliza um controlador de ODBC de ANSI, o Gestor do controlador de ODBC incorrectamente poderá devolver SQL_NO_DATA_FOUND para uma coluna que é definida como VARCHAR ou carácter e que tem uma cadeia vazia. O problema não ocorre Se a coluna contiver alguns dados ou um valor de "Nulo". O problema só ocorre se os dados são uma cadeia vazia e ligá-la do lado do cliente com SQL_C_WCHAR.
Causa
O Gestor do controlador ODBC incorrectamente assume que o controlador não tem quaisquer dados quando tenta converter a cadeia vazia de ANSI para UNICODE.
Resolução
Para resolver este problema, obtenha o mais tardar Service pack para Microsoft SQL Server 2000. Para obter informações adicionais, clique em o número de artigo seguinte para visualizar o artigo na Knowledge da Microsoft Base:
290211 INF: Como obter o Service Pack mais recente do SQL Server 2000
Como contornar
Uma solução simple para este problema é ligar a coluna como SQL_C_CHAR em vez de SQL_C_WCHAR.
Ponto Da Situação
Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo. Este problema foi primeiro corrigido no Microsoft SQL Server 2000 Service Pack 3.
Mais Informação
Não podem aplicações legadas que utilizem um controlador ODBC de ANSI verificar este problema, porque estas não podem ligar a coluna como SQL_C_WCHAR. Uma vez que o fornecedor do Microsoft ODBC .NET liga colunas de caracteres como SQL_C_WCHAR Por predefinição, poderá detectar este problema se utilizar o ODBC do Microsoft .NET Fornecedor com um controlador de ANSI. Tenha em atenção que o fornecedor de ODBC do Microsoft .NET Devolve ": NO_DATA" quando este problema ocorre.

Passos para reproduzir o comportamento

Amostras nativa seguinte demonstra o problema:
  1. Utilize o seguinte script para criar uma tabela e insira um disco registo:
    Create Table Test (ID integer, COL1 CHAR(10))Insert Into Test VALUES (1,'')					
  2. Execute o programa de C seguinte:
    #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;}					
    Recebe a seguinte mensagem:
    SQL_NO_DATA_FOUND foi devolvido.
    Premir a tecla Enter para continuar...
MYSQL

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 319243 - Última Revisão: 12/07/2015 09:14:22 - Revisão: 7.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbhotfixserver kbqfe kbdownload kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix kbmt KB319243 KbMtpt
Comentários