none
Inserir datarow com erro em datatable RRS feed

  • Pergunta

  • Olá.
    Sei que existe a propriedade HasError tanto no DataTable quanto no DataRow.
    Antes de enviar as alterações para o banco, tem que verificar se existe erro no DataTable certo.

    Porem eu nao sei em que caso que seria possivel ocorrer a inserção de uma row com erro no datatable.
    Fiz o exemplo abaxo


            
           DataTable dt = new DataTable();
           
            DataColumn dc = new DataColumn();
            dc.ColumnName = "nome";
            dc.DataType = typeof(string);
            dc.MaxLength = 5;
    
            dt.Columns.Add(dc);
    
            dc = new DataColumn();
            dc.ColumnName = "idade";
            dc.DataType = typeof(int);
    
            dt.Columns.Add(dc);
    try
            {
                DataRow drNew = dt.NewRow();
                drNew ["nome"] = "testeeeeeeee";
                drNew ["idade"] = 10;
                
                dt.Rows.Add(drNew );
    
            }
    catch (Exception)
            {
                DataRow[] drBadRow = dt.GetErrors();
                string msgErro = null;
             
                foreach (DataRow dr in drBadRow)
                { 
                    foreach(DataColumn dc in dr.GetColumnsInError())
                    {
                        msgErro = "A coluna "+ dc +" apresenta o seguinte erro: "+dr.GetColumnError(dc);
                    }
                   Response.Write(msgErro);              
              }
    Na linha dt.Rows.Add(drNew ) o programa vai para o catch..... e a propriedade dt.hasError, ou dt.GetError é sempre false / null.
    Em que caso que daria para inserir uma linha com erro no datatable ?
    Ou mesmo se eu tento editar uma linha, na hora de editar vai para o catch, e a propriedade da linha HasError fica como false, pois nao foi enviada a alteração para o datatable.

    Obrigado
    segunda-feira, 18 de maio de 2009 03:00

Respostas

  • Oi,

    Me corrija caso eu esteja errado, mas você está apenas estudando o funcionamento do haserror e geterror, certo ?

    Estes dois não são utilizados neste caso, mas sim em caso de erro no servidor.

    Imagine que você faça uma deleção de registro, porém o servidor recuse por causa de uma chave estrangeira, ou então uma inserção de registro e o servidor recuse por causa de alguma regra existente só no servidor.

    Após o update do adapter, quando o erro ocorre, a linha da datatable vem marcada com um erro e o erro do servidor pode ser recuperado.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:44
    terça-feira, 19 de maio de 2009 02:38
  • extraído da documentação msdn...

        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable workTable = new DataTable("Customers");
            workTable.Columns.Add("CustID", typeof(Int32));
            workTable.Columns.Add("Total", typeof(Double));
    
            workTable.RowChanged += new DataRowChangeEventHandler(OnRowChanged);
    
            for (int i = 0; i < 10; i++)
                workTable.Rows.Add(new Object[] { i, i * 100 });
    
            if (workTable.HasErrors)
            {
                Console.WriteLine("Errors in Table " + workTable.TableName);
    
                foreach (DataRow myRow in workTable.GetErrors())
                {
                    Console.WriteLine("CustID = " + myRow["CustID"]);
                    Console.WriteLine(" Error = " + myRow.RowError + "\n");
                }
            }
        }
    
        protected static void OnRowChanged(Object sender, DataRowChangeEventArgs args)
        {
            // Check for zero values.
            if (args.Row["Total"].Equals(0D))
                args.Row.RowError = "Total cannot be 0.";
        }



    Espero ter ajudado, boa sorte! Fábio Morikawa
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:39
    terça-feira, 19 de maio de 2009 13:56
  • Oi,

    Sim, pode validar dados. Mas a sua forma de validar dados antes de ir ao banco é verificando se sua datarow será ou não aceita pela datatable, e não utilizando haserrors.

    Para um exemplo do haserrros, provoque um erro de chave estrangeira e no retorno da atualização do banco poderá ver a propriedade verdadeira.

    Indo além em termos de validação no client, a datatable permite a criação de uma partial class para validar cada propriedade.

    Indo além sobre uma camada de negócios, esta poderia validar dados da datatable conforme regras de negócio e utilizar métodos seterror para indicar linhas e colunas com erro.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Sugerido como Resposta Dennes terça-feira, 19 de maio de 2009 14:52
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:38
    terça-feira, 19 de maio de 2009 14:43

Todas as Respostas

  • Olá,

    Você definiu o MaxLength da coluna nome com 5

    DataColumn dc = new DataColumn();
            dc.ColumnName = "nome";
            dc.DataType = typeof(string);
            dc.MaxLength = 5;


    e esta tentando colocar na coluna mais de 10 caracter
          drNew ["nome"] = "testeeeeeeee";

    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    segunda-feira, 18 de maio de 2009 14:29
  • Oi,

    Me corrija caso eu esteja errado, mas você está apenas estudando o funcionamento do haserror e geterror, certo ?

    Estes dois não são utilizados neste caso, mas sim em caso de erro no servidor.

    Imagine que você faça uma deleção de registro, porém o servidor recuse por causa de uma chave estrangeira, ou então uma inserção de registro e o servidor recuse por causa de alguma regra existente só no servidor.

    Após o update do adapter, quando o erro ocorre, a linha da datatable vem marcada com um erro e o erro do servidor pode ser recuperado.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:44
    terça-feira, 19 de maio de 2009 02:38
  • Olá.
    Obrigado Daniel, e Dennes.
    Sim, estou estudando essas funcionalidades, o erro eu ocasionei de proposito.
    É como se o dado fosse uma entrada pelo usuario.

    Hummm... nao entendi muito bem Dennes :'( . Então nao teria como eu validar os erros, sem precisar abrir a conexao com o banco, ir ate o banco e ai sim verificar ue o DT contem erro? Eu imaginei que desse pra eu validar os dados direto no datatable com essas propriedades.. algo do tipo
    if ! dt.haserror
       aqui eu usaria o update para enviar as informações para o banco.

    Será que vc ( ou alguém ) tem algum exemplo para eu ver o funcionamento? onde a propriedade haserror e geterror são true...

    Obrigado novamente.
    terça-feira, 19 de maio de 2009 11:44
  • extraído da documentação msdn...

        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable workTable = new DataTable("Customers");
            workTable.Columns.Add("CustID", typeof(Int32));
            workTable.Columns.Add("Total", typeof(Double));
    
            workTable.RowChanged += new DataRowChangeEventHandler(OnRowChanged);
    
            for (int i = 0; i < 10; i++)
                workTable.Rows.Add(new Object[] { i, i * 100 });
    
            if (workTable.HasErrors)
            {
                Console.WriteLine("Errors in Table " + workTable.TableName);
    
                foreach (DataRow myRow in workTable.GetErrors())
                {
                    Console.WriteLine("CustID = " + myRow["CustID"]);
                    Console.WriteLine(" Error = " + myRow.RowError + "\n");
                }
            }
        }
    
        protected static void OnRowChanged(Object sender, DataRowChangeEventArgs args)
        {
            // Check for zero values.
            if (args.Row["Total"].Equals(0D))
                args.Row.RowError = "Total cannot be 0.";
        }



    Espero ter ajudado, boa sorte! Fábio Morikawa
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:39
    terça-feira, 19 de maio de 2009 13:56
  • Oi,

    Sim, pode validar dados. Mas a sua forma de validar dados antes de ir ao banco é verificando se sua datarow será ou não aceita pela datatable, e não utilizando haserrors.

    Para um exemplo do haserrros, provoque um erro de chave estrangeira e no retorno da atualização do banco poderá ver a propriedade verdadeira.

    Indo além em termos de validação no client, a datatable permite a criação de uma partial class para validar cada propriedade.

    Indo além sobre uma camada de negócios, esta poderia validar dados da datatable conforme regras de negócio e utilizar métodos seterror para indicar linhas e colunas com erro.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Sugerido como Resposta Dennes terça-feira, 19 de maio de 2009 14:52
    • Marcado como Resposta Superkiko85 quarta-feira, 20 de maio de 2009 23:38
    terça-feira, 19 de maio de 2009 14:43
  • Olá.
    Obrigado a todos.
    Entendi o exemplo fábio.
    Dennes, obrigado tambem pelas explicações, ficou bem masi claro agora... ou melhor, ficou claro :D.

    Eu imaginei errado, pensei qeu o datatable fizesse todas validações automatico, fiquei umas 4 horas tentando causar erro da forma como iniciei o poste para estudar, mas agora entendi que precisa ciar um método para validar as rows e adicionar erro à elas, seguindo o exemplo do Fábio.

    Obrigado.


    quarta-feira, 20 de maio de 2009 23:44