5
respostas

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Esta jogando o erro System.NullReferenceException: 'Object reference not set to an instance of an object.'

meu código é

var lista = new List();
using var connection= ObterConexao();
connection.Open();

string sql = "SELECT * FROM Artistas ";
using var command = new SqlCommand(sql, connection);
using SqlDataReader dataReader = command.ExecuteReader(); """Aqui está o problema""

while (dataReader.Read())
{
string nomeArtista= Convert.ToString(dataReader["Nome"]);
string bioArtista = Convert.ToString(dataReader["Bio"]);
int idArtista = Convert.ToInt32(dataReader["Id"]);
Artista artista = new(nomeArtista,bioArtista) { Id = idArtista };

lista.Add(artista);

}

return lista;

5 respostas

Olá, Gerardo! Tudo bem?

Esse erro (NullReferenceException) é um velho conhecido nosso! Ele acontece quando tentamos usar um objeto que ainda está vazio (null). Como você apontou que o problema estoura na linha do ExecuteReader(), é muito provável que a sua conexão (via ObterConexao()) ou o próprio comando não estejam sendo instanciados corretamente antes de chegar aí.

Para que eu possa investigar a fundo e te ajudar de forma assertiva, por favor, me responda: qual é o curso e a atividade que você está fazendo?

Peço também que compartilhe o seu código completo, especialmente o método ObterConexao(). Sem visualizar a classe inteira fica incerto dizer o que está faltando, mas com o código completo eu consigo simular o erro por aqui e te passar a solução exata!

Fico no aguardo do seu retorno para resolvermos isso juntos.

Bons estudos!

Sucesso

Imagem da comunidade

Oi boa noite, autalmente to fazendo o curso .NET persintindo dados com entity framework core. Segue meu código da classe

`namespace ScreenSound.Banco;
internal class Connection
{
private string connectionString = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog="Screen Sound";Integrated Security=True;Connect Timeout=30;Encrypt=True;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False;Command Timeout=30";

    public SqlConnection ObterConexao()
    {
        return new SqlConnection (connectionString);
    }

public IEnumerable<Artista> Listar()
{
    var lista = new List<Artista>();
    using var connection= ObterConexao();
    connection.Open();

    string sql = "SELECT * FROM Artistas ";
    using var command = new SqlCommand(sql, connection);
    using SqlDataReader dataReader = command.ExecuteReader();

    while (dataReader.Read())
    {
        string nomeArtista= Convert.ToString(dataReader["Nome"]);
        string bioArtista = Convert.ToString(dataReader["Bio"]);
        int idArtista = Convert.ToInt32(dataReader["Id"]);
        Artista artista = new(nomeArtista,bioArtista) { Id = idArtista };

        lista.Add(artista);
    }

    return lista;
}

}`

E o programm

using ScreenSound.Banco;
using ScreenSound.Menus;
using ScreenSound.Modelos;

try
{
    var connection = new Connection();
    var listaArtistas = connection.Listar();

    foreach(var artista in listaArtistas)
    {
        Console.WriteLine(artista);
    }
}
catch (Exception ex)
{

    Console.WriteLine(ex.Message);
}

return;


Artista ira = new Artista("Ira!", "Banda Ira!");
Artista beatles = new("The Beatles", "Banda The Beatles");

Dictionary<string, Artista> artistasRegistrados = new();
artistasRegistrados.Add(ira.Nome, ira);
artistasRegistrados.Add(beatles.Nome, beatles);

Dictionary<int, Menu> opcoes = new();
opcoes.Add(1, new MenuRegistrarArtista());
opcoes.Add(2, new MenuRegistrarMusica());
opcoes.Add(3, new MenuMostrarArtistas());
opcoes.Add(4, new MenuMostrarMusicas());
opcoes.Add(-1, new MenuSair());

void ExibirLogo()
{
    Console.WriteLine(@"

░██████╗░█████╗░██████╗░███████╗███████╗███╗░░██╗  ░██████╗░█████╗░██╗░░░██╗███╗░░██╗██████╗░
██╔════╝██╔══██╗██╔══██╗██╔════╝██╔════╝████╗░██║  ██╔════╝██╔══██╗██║░░░██║████╗░██║██╔══██╗
╚█████╗░██║░░╚═╝██████╔╝█████╗░░█████╗░░██╔██╗██║  ╚█████╗░██║░░██║██║░░░██║██╔██╗██║██║░░██║
░╚═══██╗██║░░██╗██╔══██╗██╔══╝░░██╔══╝░░██║╚████║  ░╚═══██╗██║░░██║██║░░░██║██║╚████║██║░░██║
██████╔╝╚█████╔╝██║░░██║███████╗███████╗██║░╚███║  ██████╔╝╚█████╔╝╚██████╔╝██║░╚███║██████╔╝
╚═════╝░░╚════╝░╚═╝░░╚═╝╚══════╝╚══════╝╚═╝░░╚══╝  ╚═════╝░░╚════╝░░╚═════╝░╚═╝░░╚══╝╚═════╝░
");
    Console.WriteLine("Boas vindas ao Screen Sound 3.0!");
}

void ExibirOpcoesDoMenu()
{
    ExibirLogo();
    Console.WriteLine("\nDigite 1 para registrar um artista");
    Console.WriteLine("Digite 2 para registrar a música de um artista");
    Console.WriteLine("Digite 3 para mostrar todos os artistas");
    Console.WriteLine("Digite 4 para exibir todas as músicas de um artista");
    Console.WriteLine("Digite -1 para sair");

    Console.Write("\nDigite a sua opção: ");
    string opcaoEscolhida = Console.ReadLine()!;
    int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida);

    if (opcoes.ContainsKey(opcaoEscolhidaNumerica))
    {
        Menu menuASerExibido = opcoes[opcaoEscolhidaNumerica];
        menuASerExibido.Executar(artistasRegistrados);
        if (opcaoEscolhidaNumerica > 0) ExibirOpcoesDoMenu();
    } 
    else
    {
        Console.WriteLine("Opção inválida");
    }
}

ExibirOpcoesDoMenu();

Olá, Gerardo! Tudo bem?

Ótimo você ter enviado o código completo. A estrutura da sua classe está correta, então esse NullReferenceException no ExecuteReader() provavelmente está sendo causado pela string de conexão.

Acredito que o problema pode estar na formatação da ConnectionString. No seu caso, há três pontos críticos: falta o @ antes da string (por causa da barra \ do LocalDB), o uso de aspas internas em Initial Catalog="Screen Sound" quebra a string, e o Encrypt=True com Trust Server Certificate=False impede a conexão no LocalDB, que não tem certificado SSL configurado por padrão.

Substitua sua string por esta versão simplificada:

private string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Screen Sound;Integrated Security=True;Encrypt=False";

Confirme também se está usando:

using Microsoft.Data.SqlClient;

e não System.Data.SqlClient.

Faça essa alteração e execute novamente. O erro mudou ou foi resolvido?

Bons estudos!

Sucesso

Imagem da comunidade

Opa boa tarde, fiz mas o problema ainda é o mesmo

Oii Gerardo, como você está?

Ainda não conseguir observar o erro, no seu caso quando o erro de NullReferenceException estoura exatamente na linha do ExecuteReader(), muitas vezes significa que a conexão até abriu, mas o comando no banco falhou e retornou vazio (nulo). Isso costuma acontecer pelos seguintes motivos:

Precisamos confirmar se o banco "Screen Sound" e a tabela "Artistas" foram realmente criados no seu servidor local. Abra a janela do SQL Server Object Explorer aí no seu Visual Studio, procure pela conexão (localdb)\MSSQLLocalDB e veja se eles estão por lá. Se eles não existirem, o comando SQL não vai encontrar nada e vai gerar esse erro. Certifique-se de ter rodado o script para criá-los!

Como o nome do seu banco tem um espaço ("Screen Sound"), precisamos garantir que a string entenda isso como um nome único. O ideal é usar aspas duplas escapadas. Teste deixar a sua variável exatamente assim:

private string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=""Screen Sound"";Integrated Security=True;Encrypt=False";

Faça esses ajustes com calma e teste novamente. Caso o erro teime em continuar, peço que você suba o seu projeto completo no GitHub e compartilhe o link do repositório (lembre-se de deixá-lo público) aqui comigo. Assim, eu consigo clonar o projeto na minha máquina, testar e te dar a solução cravada!

Peço só paciência e o seu código rsrs, seria legal compartilhar a aula exata em que vc parou, vai dar certo, prometo!

No aguardo!