none
CRUD em Memória RRS feed

  • Pergunta

  • Saudações !

    Tenho uma classe com um metodo listar() retornando um dataset e gostaria de passar este dataset como fonte de dados para o gridview/formview e desconectado, poder incluir novos registros, excluir, alterar e tudo em memória. Depois ao pressionar um botão "Salvar Tudo" que fosse aplicado todas as operações no banco dados.  

    Agradeço a quem poder indicar um artigo ou dar alguma dica.

    sexta-feira, 25 de maio de 2012 02:08

Respostas

Todas as Respostas

  • pq vc não usa um datatable e o usuário vai incluindo os registros qdo cliclar no botão gravar percorre o DataTable e grava os registros, tenho algo assim onde o usuário inclui os feriados que tiverem no mês e um botão gravar, o DataTable é vinculado a uma gridview ai percorro o DataTable e vou gravando os itens um a um.

    Junior

    sexta-feira, 25 de maio de 2012 11:10
  • A sugestão do Junior_luiz funcionará perfeitamente.

    Tenho uma aplicação que funciona desta forma e bem. Inclusive com um legado em SAP.

    Vale ressaltar  que você deverá gravar seu datatable em ViewState e dependendo do tamanho dele pode ocorrer erro.


    Ninguém falou que seria fácil!

    sexta-feira, 25 de maio de 2012 12:24
  • Junior e Jothaz,

    Obrigado pelas dicas.

    A ideia é exatamente esta, só não estou conseguindo alimentar o formview com a instancia de um datatable criado anteriormente, sem falar que em vários momentos deverá existir postback e o objeto será recriado.  Qual a melhor maneira de persistir este objeto, ViewState ou Session?

    Na verdade estou tentando fazer uma formulário de pedidos, e não da pra ir lançando no banco de dados antes de salvar tudo, pq o usuário pode lançar o cabeçalho e vários itens e depois desistir, ou pode lançar, excluir e alterar itens, fazer tudo isso direto no banco pode consumir muito recurso do servidor.


    sexta-feira, 25 de maio de 2012 12:39
  • Jothan,

    Poderia explicar melhor pq iria ocorrer erro dependendo do tamanho ? Obrigado.

    sexta-feira, 25 de maio de 2012 12:47
  • Jousival, o que tenho aqui é assim, tenho dois textbox e um botão "Incluir" então o usuário informa a data do feriado e a descrição e clica no botão gravar ai incluo o registro no DataTable na página tenho um botão incluir pedido esse qdo clicado percorro o datatable do feriado e gravo na tabela, bem como o pedido que tb tem seu datatable. Na página vc pode ter qos DataTable quiser.


    Junior

    sexta-feira, 25 de maio de 2012 13:33
  • Jousival,

    faz o seguinte, na sua classe q retorna seu dataset, vc pode trabalhar com a ideia de cache.

    http://www.4guysfromrolla.com/articles/100902-1.aspx

    http://www.25hoursaday.com/weblog/2007/07/05/ASPNETCachingVsMemcachedSeekingEfficientDataPartitioningLookupAndRetrieval.aspx


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    • Marcado como Resposta Harley Araujo segunda-feira, 28 de maio de 2012 13:46
    sexta-feira, 25 de maio de 2012 13:57
    Moderador
  • Pessoal obrigado pelas dicas!

    Abaixo descreve como consegui resolver o problema:

    1. Criei uma classe DAO com um campo do tipo DataTable que como o próprio nome sugere, acumula os dados, "dtAcumulador" .

    1.1 O método Popular(), ler registros do banco de dados e alimenta o dtAcumulador.

    1.2 Os métodos listar vão ler do datatable e retornar uma lista de objeto ou um objeto do tipo especificado.

    1.3 Os métodos inserir, alterar e excluir, vão manipular o datatable, observe o código do método inserir.

        public class Teste_DAO
        {
            private DataTable dtAcumulador;

            public void Popular() ...
            public System.Collections.Generic.List<Teste> listar() ...
            public Banco listar(int id_teste) ...

            public retorno inserir(Teste teste)
           {
                DataRow registro = dtAcumulador.NewRow();
                registro["id_teste"] = teste.id_teste.ToString();
                registro["nome_teste"] = teste.nome_teste;
               dtAcumulador.Rows.Add(registro);
            }

            public retorno alterar(Teste teste) ...
            public retorno excluir(Teste teste) ...
            public int SalvarTudonoBanco() ...
         }

    2. Na página aspx:

        2.1 Criei uma instância da classe acima e salvo num Session este objeto no primeiro carregamento, nos demais, alimento o objeto com o que já salvei no session.

         public Teste_DAO teste_dao = new Teste_DAO();

         protected void Page_Load(object sender, EventArgs e)
         {
           if (! IsPostBack)
           {
              Session["teste_dao"] = teste_dao;

           }
           else
           {
              teste_dao= (Teste_DAO)Session["teste_dao"];
           }
         }

    2.2 No objectdatasource, defini qual a instância do objeto o controle deveria usar.

         protected void objectdatasource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
         {
                e.ObjectInstance = teste_dao;
         }

    2.3 Nos eventos objectdatasource_Inserted, objectdatasource_Updated, objectdatasource_Deleted, atualizei o session criado acima, para ter sempre todas as atualizações.

              Session["teste_dao"] = teste_dao;

    Pronto, agora é só rodar o método SalvarTudonoBanco() que irá utilizar o datatable para persistir tudo no banco.

    O que acham desta solução? 

    Li os artigos indicados pelo Bonancio, mas conclui que o Session é mais indicado para este caso do que o cache. É isso mesmo ou não entendi corretamente.

    segunda-feira, 28 de maio de 2012 14:19