BUG: O erro "Referência de objeto não definida para uma instância de um objeto" ocorre quando você tenta acessar os dados usando o ADO Interop em uma página do ASP.NET


Cuidado Os ADO e os ADO MD não foram totalmente testados em um ambiente do Microsoft .NET Framework. Eles talvez causem problemas intermitentes, especialmente em aplicativos com base em serviço ou em aplicativos multithread. As técnicas discutidas neste artigo devem ser usadas somente como uma medida temporária durante a migração para ADO.NET. Você deve usar essas técnicas somente ao concluir testes completos para verificar se não há problemas de compatibilidade. Todos os problemas causados pelo uso de ADO ou de ADO MD dessa maneira não têm suporte. Para obter mais informações, consulte o seguinte artigo da Base de Dados de Conhecimento Microsoft:
840667 Você recebe erros inesperados ao usar ADO e ADO MD em um aplicativo do .NET Framework

Sintomas


Em um computador que tem o Microsoft .NET Framework 1.0 instalado (e que não tenha o Microsoft Visual Studio .NET instalado), ao tentar acessar os dados usando o ADO Interop em uma página do ASP.NET que resida em um site idêntico e que esteja hospedado no mesmo computador, a seguinte mensagem de erro poderá ser exibida:
Detalhes da Exceção: System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto.

Resolução


Para resolver este problema, registre o arquivo Adodb.dll no GAC (cache de assembly global). Em um computador em que apenas o .NET Framework está instalado, o arquivo Gacutil.exe não existe. Obtenha o arquivo gacutil instalando o Microsoft .NET Framework SDK ou crie um projeto de instalação do Visual Studio.NET que use o instalador para instalar os componentes corretos.

Para registrar Adodb.dll no GAC, execute as seguintes etapas:
  1. Clique em Iniciar e em Executar.
  2. Na caixa de diálogo Executar, digite o seguinte comando e, em seguida, clique em OK:
    C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\gacutil /i C:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll

Status


A Microsoft confirmou que esse é um problema que ocorre nos produtos Microsoft listados no início deste artigo.

Informações adicionais


Etapas para reproduzir o comportamento

  1. Crie um novo projeto do Microsoft Visual C# chamado ADORefError. Por padrão, o WebForm1.aspx aparece.
  2. No menu Project, clique em Add Reference.
  3. Na guia .NET, selecione adodb na lista suspensa.
  4. Clique em Select e, em seguida, clique em OK.
  5. Arraste um controle Label da caixa de ferramentas para o WebForm1.aspx.
  6. No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em Exibir código.
  7. Cole o seguinte código no evento Page_Load:

    Observação É necessário alterar o valor de User Id nome_do_usuário para uma conta que tenha as permissões apropriadas para realizar as operações no banco de dados.
    //Create ADODB ObjectsADODB.Connection oConn = new ADODB.ConnectionClass();ADODB.Recordset oRS = new ADODB.RecordsetClass();//Change Connection String depending on your SQL Server string strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=<username>;Initial Catalog=pubs;Data Source=Your SQLServer Name";oConn.Open(strConn,"","",0);object objRecs = 100;oRS = oConn.Execute("select au_Id, au_lname from authors", out objRecs,0);//Error is generated by referencing the Fields collectionLabel1.Text = oRS.Fields["au_id"].Value.ToString();//Close all connectionsoRS.Close();oConn.Close();//Release COM ObjectsoRS = null;oConn = null;
  8. Copie o Adodb.dll (da pasta C:\Program Files\Microsoft.NET\Primary Interop Assemblies\) para a pasta Bin do aplicativo ADORefError.
  9. No menu Compilar, clique em Compilar Solução.
  10. Inicie o Microsoft Internet Explorer e, em seguida, navegue até o WebForm1.aspx, especificando a seguinte URL, em que
    IISServerName é o nome do servidor do IIS (Serviços de informações da Internet):
    http://IISServerName/ADORefError/WebForm1.aspx
  11. Identifique um computador de teste que tenha o .NET Framework instalado (sem o Microsoft Visual Studio .NET). No IIS, crie dois diretórios virtuais e nomeie-os Test1 e Test2.
  12. Crie dois sites idênticos: da pasta ADORefError, copie o WebForm1.aspx e a pasta Bin para as pastas Test1 e Test2 no computador de teste.
  13. Inicie o Microsoft Internet Explorer e navegue até o WebForm1.aspx do site Test1, especificando a seguinte URL, em que
    IISServerName é o nome do servidor do IIS (Serviços de informações da Internet):
    http://IISServerName/Test1/WebForm1.aspx
  14. Inicie outra instância do Microsoft Internet Explorer e navegue até WebForm1.aspx do site Test2, especificando a seguinte URL, em que:
    http://IISServerName/Test2/WebForm1.aspx
  15. Ao acessar o WebForm1.aspx de Test2, a seguinte mensagem de erro detalhada na seção SINTOMAS, poderá ser exibida.

Referências


Para obter mais informações sobre como registrar arquivos .dll no GAC, acesse o seguinte site da Microsoft (em inglês):