none
Problemas com DataRow(Object reference not set to an instance of an object.) RRS feed

  • Pergunta

  • Galera sou novo em .NET e to tendo algumas dificuldades, eu gostaria de saber o que ta errado na minha classe de conexão, segue o código:

     public class ConexaoFillUpdateCommand
        {
            public Label lblException = new Label() { Text = "" };
            public ConexaoFillUpdateCommand()
            {
                try
                {
                    SqlConnection conn = new SqlConnection(@"Server=.\SQLEXPRESS;Database=Northwind;User ID=sa;Password=milao");

                    string sql = "SELECT ProductID, ProductName FROM Products";

                    SqlCommand cmd = new SqlCommand(sql, conn);

                    DataSet ds = new DataSet();

                    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);

                    adapter.UpdateCommand = new SqlCommand("UPDATE Products SET ProductName = @Produtos WHERE ProcuctId = @IdProdutos", conn);
                    adapter.UpdateCommand.Parameters.Add("@Produtos", SqlDbType.NVarChar, 40, "ProductName");
                    SqlParameter param = adapter.UpdateCommand.Parameters.Add("@IdProdutos", SqlDbType.Int);
                    //Agora iremos Pegar ou Setar o nome da coluna mapeada no DataSet
                    param.SourceColumn = "ProductID";
                    param.SourceVersion = DataRowVersion.Original;

                    // Atualizando os Registros
                    DataRow linha = ds.Tables["Produtos"].Rows[0]; // O erro acontece nessa Linha, porque???
                    linha["ProductName"] = "Outro Produto";
                }
                catch (SqlException esql)
                {
                    lblException.Text = "Erro de SQL " + esql;
                }
                catch (InvalidOperationException ie)
                {
                    lblException.Text = "Operação inválida " + ie;
                }
                catch (Exception ex)
                {
                    lblException.Text = "Erro ao executar o código " + ex;
                }


            }
        }
    }

    domingo, 20 de maio de 2012 14:37

Respostas

  • O seu dataSet não tem linhas e você está tentando recuperar os registros da primeira linha ( Rows[0]).

    Você tem que chamar o método Update do DataAdapter.

    http://msdn.microsoft.com/pt-br/library/system.data.common.dataadapter.update.aspx


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 15:20
  • Deve ser erro de conversão de object para DataRow, tenta isso naquela linha:

    DataRow linha = (DataRow)ds.Tables["Produtos"].Rows[0];

    Abraços!


    thiagokoelho

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 15:35
  • Olá Renato,

    Faltou o comando Fill para popular seu DataSet.

    Tente assim:

      SqlConnection conn = new SqlConnection(@"Server=.\SQLEXPRESS;Database=Northwind;User ID=sa;Password=milao");
     
                    string sql = "SELECT ProductID, ProductName FROM Products";
     
                    SqlCommand cmd = new SqlCommand(sql, conn);
     
                    DataSet ds = new DataSet();
     
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
     
                    // Esta é a linha nova...
    adapter.Fill(ds); adapter.UpdateCommand = new SqlCommand("UPDATE Products SET ProductName = @Produtos WHERE ProcuctId = @IdProdutos", conn); adapter.UpdateCommand.Parameters.Add("@Produtos", SqlDbType.NVarChar, 40, "ProductName"); SqlParameter param = adapter.UpdateCommand.Parameters.Add("@IdProdutos", SqlDbType.Int); //Agora iremos Pegar ou Setar o nome da coluna mapeada no DataSet param.SourceColumn = "ProductID"; param.SourceVersion = DataRowVersion.Original; // Atualizando os Registros DataRow linha = ds.Tables["Produtos"].Rows[0]; // O erro acontece nessa Linha, porque??? linha["ProductName"] = "Outro Produto";

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 16:21
    Moderador

Todas as Respostas

  • O seu dataSet não tem linhas e você está tentando recuperar os registros da primeira linha ( Rows[0]).

    Você tem que chamar o método Update do DataAdapter.

    http://msdn.microsoft.com/pt-br/library/system.data.common.dataadapter.update.aspx


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 15:20
  • Deve ser erro de conversão de object para DataRow, tenta isso naquela linha:

    DataRow linha = (DataRow)ds.Tables["Produtos"].Rows[0];

    Abraços!


    thiagokoelho

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 15:35
  • Olá Renato,

    Faltou o comando Fill para popular seu DataSet.

    Tente assim:

      SqlConnection conn = new SqlConnection(@"Server=.\SQLEXPRESS;Database=Northwind;User ID=sa;Password=milao");
     
                    string sql = "SELECT ProductID, ProductName FROM Products";
     
                    SqlCommand cmd = new SqlCommand(sql, conn);
     
                    DataSet ds = new DataSet();
     
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
     
                    // Esta é a linha nova...
    adapter.Fill(ds); adapter.UpdateCommand = new SqlCommand("UPDATE Products SET ProductName = @Produtos WHERE ProcuctId = @IdProdutos", conn); adapter.UpdateCommand.Parameters.Add("@Produtos", SqlDbType.NVarChar, 40, "ProductName"); SqlParameter param = adapter.UpdateCommand.Parameters.Add("@IdProdutos", SqlDbType.Int); //Agora iremos Pegar ou Setar o nome da coluna mapeada no DataSet param.SourceColumn = "ProductID"; param.SourceVersion = DataRowVersion.Original; // Atualizando os Registros DataRow linha = ds.Tables["Produtos"].Rows[0]; // O erro acontece nessa Linha, porque??? linha["ProductName"] = "Outro Produto";

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta renatojcastro domingo, 20 de maio de 2012 16:48
    domingo, 20 de maio de 2012 16:21
    Moderador
  • eu tinha esquecido justamente do Fill

    [Code]

    public class ConexaoFillUpdateCommand
        {
            public Label lblException = new Label() { Text = "" };
            public ConexaoFillUpdateCommand()
            {
                try
                {
                    SqlConnection conn = new SqlConnection(@"Server=.\SQLEXPRESS;Database=Northwind;User ID=sa;Password=milao");

                    string sql = "SELECT ProductID, ProductName FROM Products";

                    SqlCommand cmd = new SqlCommand(sql, conn);

                    DataSet ds = new DataSet();

                    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);

                    adapter.UpdateCommand = new SqlCommand("UPDATE Products SET ProductName = @Produtos WHERE ProcuctId = @IdProdutos", conn);
                    adapter.UpdateCommand.Parameters.Add("@Produtos", SqlDbType.NVarChar, 40, "ProductName");
                    SqlParameter param = adapter.UpdateCommand.Parameters.Add("@IdProdutos", SqlDbType.Int);
                    //Agora iremos Pegar ou Setar o nome da coluna mapeada no DataSet
                    param.SourceColumn = "ProductID";
                    param.SourceVersion = DataRowVersion.Original;

                    adpater.Fill(ds, "Produtos") // esqueci de colocar pra popular o DataSet "Produtos", então abaixo vou conseguir ler a primeira linha do DataSet "Produtos"



                    // Atualizando os Registros
                    DataRow linha = ds.Tables["Produtos"].Rows[0]; 
                    linha["ProductName"] = "Outro Produto";
                }
                catch (SqlException esql)
                {
                    lblException.Text = "Erro de SQL " + esql;
                }
                catch (InvalidOperationException ie)
                {
                    lblException.Text = "Operação inválida " + ie;
                }
                catch (Exception ex)
                {
                    lblException.Text = "Erro ao executar o código " + ex;
                }


            }
        }
    }

    [/code]

    VALEU MESMO GALERA


    domingo, 20 de maio de 2012 16:48