PROBLEMA: Consulta teste para NULL no banco de dados do Access não retornar registros com o Jet 4.0

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 237992
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Ao usar uma instrução SQL com uma cláusula WHERE que contém um teste para NULL usando o operador =, registros que coincidirem com a consulta não são retornados no conjunto de registros. Isso acontece com Jet 4.0 ao usar o DAO, ODBC ou OLE. Aqui estão alguns exemplos de tais consultas:
SELECT * FROM Customers WHERE region = NULLSELECT * FROM Customers WHERE region = NOT NULL				
Essas consultas funcionavam corretamente com o Jet 3.5 e retornados os registros conforme o esperado.
Esse comportamento será ser apresentou somente em computadores com o MDAC 2.1 e posterior que tenham o Jet 4.0 instalado.
Causa
Jet 4.0 feito algumas alterações a sintaxe de SQL e agora é mais SQL ANSI 92 compatível que antes. Especialmente comportamento SQL ANSI 92 NULL foi implementado. Lembre-se também de que o resultado de uma expressão booleana pode ter três resultados - TRUE, FALSE e NULL (em alguns documentos chamados desconhecido).

A sintaxe compatível com ANSI para valores nulos de teste usa a palavra-chave IS. São exemplos de consultas que funcionam:
SELECT * FROM Customers WHERE region IS NULLSELECT * FROM Customers WHERE region IS NOT NULL				
Resolução
Use a palavra-chave IS em consultas que testar para NULL. Essa alteração não quebrará em sistemas com Jet 3.5 como Jet 3.5 aceita dois tipos de consultas.
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir

Todas as três seções usam o banco de dados de exemplo Northwind que pode ser instalado com o Access 97. Se instalado, ele estará localizado na subpasta Office\Samples da instalação do Microsoft Office.

ODBC DO MFC

  1. Crie um DSN ODBC no miniaplicativo de fontes de dados ODBC no Painel de controle que aponta para o arquivo Northwind.mdb .
  2. Crie um aplicativo MFC AppWizard com banco de dados oferecer suporte . Use ODBC e especificar a tabela Customers da fonte de ODBC criada na etapa anterior, como a origem para o conjunto de registros.
  3. Definir um filtro no conjunto de registros antes que ele seja aberto. Na sua classe de modo de exibição , Insira a seguinte linha como a segunda linha no método OnInitialUpdate().
    m_pSet->m_strFilter = "Region = NULL";						
  4. Crie uma caixa de edição e vinculá-lo ao campo CódigoDoCliente no conjunto de registros para ver o campo no formulário.
  5. Compile e execute o programa. Não há registros serão retornados.

MFC DAO

  1. Crie um aplicativo MFC AppWizard com banco de dados oferecer suporte . Use o DAO e especificar a tabela Customers do banco de dados de exemplo Northwind de como a fonte para o conjunto de registros.
  2. Aplicar a correção do artigo seguinte se criar usar um não-unicode .
    235507Erro: DAO 3.6 causa erros de depuração no MFC DAO não-Unicode compilações
  3. Insira a seguinte linha no método de CWinAppEx do aplicativo para carregar DAO 3.6, conforme descrito no seguinte artigo.
    237992PROBLEMA: Não reconhecido formatar erro banco de dados com o Access 2000
    AfxGetModuleState()->m_dwVersion = 0x0601;						
    Isso garantirá que o mecanismo Jet 4.0 é carregado.
  4. definir um filtro no conjunto de registros antes que ele está aberto. na sua classe de modo de exibição , inserir a seguinte linha como a segunda linha no método OnInitialUpdate().
    m_pSet->m_strFilter = "Region = NULL";						
  5. Crie uma caixa de edição e vinculá-lo para o campo CódigoDoCliente no conjunto de registros para ver o campo no formulário.
  6. Compile e execute o programa. Não há registros serão retornados.

ADO

  1. Crie um aplicativo de console do Win32 .
  2. Insira a seguinte linha para usar o ADO.
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )						
  3. Cole o seguinte código em sua função principal:
    CoInitialize(NULL);try{	_RecordsetPtr pRs;	pRs.CreateInstance(__uuidof(Recordset));	pRs->Open(L"SELECT * FROM Customers WHERE Region = NULL",				L"Provider=Microsoft.Jet.OLEDB.4.0;"				L"Data Source=C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb;"				L"Persist Security Info=False",				adOpenStatic,				adLockOptimistic,				-1)<BR/>        if (pRs->adoEOF)	        cout << "No records returned.\n";	while (!pRs->adoEOF)	{		cout << (char*) (_bstr_t) pRs->GetFields()->GetItem(L"CustomerID")->GetValue() << endl;		pRs->MoveNext();	}}catch (_com_error& e){	cout << (char*) e.Description() << endl;}						
  4. alterar o local do arquivo Northwind.mdb se necessário para refletir o local do arquivo no seu sistema.
  5. Compilar e executar o código. Não há registros serão retornados.

Resolução

Alterar a seqüência de caracteres SQL em todas as três seções do = NULL para IS NULL e os conjuntos de registros retornará os registros corretamente.
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
236991PROBLEMA: Não reconhecido formatar erro banco de dados com o banco de dados do Access 2000
235507Erro: DAO 3.6 causa erros de depuração no MFC DAO não-Unicode compilações
152021PROBLEMA: Excluir registros contendo nulos usando DAO
Esvaziar 3.51 odbcjt32.dll msjetoledb.dll zero

Propriedades

ID do Artigo: 237992 - Última Revisão: 12/05/2015 15:19:36 - Revisão: 4.1

Microsoft Data Access Components 2.1 Service Pack 2, Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.6, Driver Microsoft Open Database Connectivity para Access 4.0, Microsoft OLE DB Provider for Jet 4.0

  • kbnosurvey kbarchive kbmt kbdatabase kbjet kbprb kbqfe KB237992 KbMtpt
Comentários