Usuário com melhor resposta
Inserir datarow com erro em datatable

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
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.
[]'sDennes
*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
-
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
-
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.
[]'sDennes
*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
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 -
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.
[]'sDennes
*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
-
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. -
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
-
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.
[]'sDennes
*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
-
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.