none
Iniciando Asp.Net em 3 camadas RRS feed

  • Pergunta

  • Olá pessoal, estou iniciando em Asp.net e também sou usuário novo no fórum. Espero poder contar com ajuda de vocês e também colaborar com o pouco que aprendi até agora(quase nada). Ficaria agradecido a vocês. 

    Bem... me familiarizando com o visual studio e o asp.net achei um guia básico na internet que fazia coisas básicas em 3 camadas utilizando Windows form. Na construção da listagem de uma tabela no banco de dados, utilizando um DataGridView, consegui listar os registros de uma tabela. Depois disso, resolvi incluir uma aplicação WEB para fazer também uma listagem básica utilizando o GridView. Não consegui! A mesma coisa que faço no WindowsForm faço na aplicação WEB, porém no último caso não funciona. A imagem abaixo explica melhor o erro e inclui as outras classes básicas(BLL, DAL) para melhores esclarecimentos:

    ERRO Classe UI

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Intra.BLL;

    namespace WebApplication1

    { public partial class SiteMaster : System.Web.UI.MasterPage { protected void Page_Load(object sender, EventArgs e) { UsuarioBLL obj = new UsuarioBLL(); usuarioGridView.DataSource = obj.Listagem(); } } }

    a linha "UsuarioGridView.DataSource = obj.Listagem()"  mostra o erro: Referência de objeto não definida para uma instância de um objeto. Sei que vocês gostariam de ver as outras classes referências e tomei a liberdade de postá-las. 

    Classe BLL

    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Intra.DAL;
    using Intra.Modelos;

    namespace Intra.BLL

    { public class UsuarioBLL { public DataTable Listagem() { UsuarioDAL obj = new UsuarioDAL(); return obj.Listagem(); } } }


    Classe DAL

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.OleDb;
    using System.Data.SqlClient;
    using Intra.Modelos;

    namespace Intra.DAL { public class UsuarioDAL { public DataTable Listagem() { DataTable tabela = new DataTable(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM usuario", Dados.StringDeConexao); dataAdapter.Fill(tabela); return tabela; } } }


    Grato pela ajuda

    quinta-feira, 6 de dezembro de 2012 20:24

Respostas

  • Cara,

    No pageload faça da seguinte fomra:

    protected void Page_Load(object sender, EventArgs e)
    {
        UsuarioBLL obj = new UsuarioBLL();
        usuarioGridView.DataSource = obj.Listagem();
        usuarioGridView.DataBind();
    }

    Você precisa invocar o DataBind() para funcionar no web.

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    • Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 6 de dezembro de 2012 20:56
    • Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:27
    • Não Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:27
    • Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:28
    quinta-feira, 6 de dezembro de 2012 20:56

Todas as Respostas

  • Cara,

    No pageload faça da seguinte fomra:

    protected void Page_Load(object sender, EventArgs e)
    {
        UsuarioBLL obj = new UsuarioBLL();
        usuarioGridView.DataSource = obj.Listagem();
        usuarioGridView.DataBind();
    }

    Você precisa invocar o DataBind() para funcionar no web.

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    • Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 6 de dezembro de 2012 20:56
    • Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:27
    • Não Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:27
    • Marcado como Resposta Alam Vilalves sexta-feira, 7 de dezembro de 2012 11:28
    quinta-feira, 6 de dezembro de 2012 20:56
  • Obrigado pela resposta Samuel!! Fiz o que você sugeriu mas não funcionou, aliás, isso eu já havia feito porém o erro não passa da linha: 

     usuarioGridView.DataSource = obj.Listagem();

    Grato


    Alam

    sexta-feira, 7 de dezembro de 2012 11:29
  • Obrigado pela resposta Samuel!! Fiz o que você sugeriu mas não funcionou, aliás, isso eu já havia feito porém o erro não passa da linha: 

     usuarioGridView.DataSource = obj.Listagem();

    Grato


    Alam

    Eu utilizo DataSet para tais funções... da forma:

    MyGridView.DataSource = ds.tables[0]
    ou tables.[0].rows... Não me recordo ao certo, será que não pode ter algo parecido para datatable ?  Ou talvez dar um Refresh () ;
    • Editado Alan Naidon sexta-feira, 7 de dezembro de 2012 16:30
    sexta-feira, 7 de dezembro de 2012 16:29
  • Cara,

    Vai debugando o seu código com F11 e entrando no método para ver onde ele está parando realmente.

    Creio que precise abrir a conexão com o banco que você não está fazendo ao invés de passar apenas a string de conexão.

    Vou postar um exemplo de como fazemos em SQL:

    using (SqlConnection sqlConexao = new SqlConnection(strMinhaStringConexao)) { SqlCommand cComando = new SqlCommand(); sqlConexao.Open(); //Aqui é onde abrimos a conexão cComando.Connection = sqlConexao; cComando.CommandText = string.Format("INSERT INTO TB_ALUNO(MATRICULA,NOME,DTNASCIMENTO,DOCUMENTONUMERO,ATIVO,CODDOCUMENTOTIPO,CODNATURAL) " + "VALUES({0},'{1}','{2}',{3},{4},{5},{6})", intMatricula, strNome, string.Format("{0:yyyy-MM-dd}", dtNascimento), strDocumentoNumero, intAtivo, intDocumentoTipo, intNatural); //Sem retorno

    cComando.ExecuteNonQuery();

    //OU

    //Retorno DataTable

    using (SqlDataAdapter cExecuta = new SqlDataAdapter(cComando))
                    {
                        cExecuta.Fill(dtRetorno);
                    }

                    return dtRetorno;

    }

    E lembre-se, você precisa do DataBind() para Web também.

    Atenciosamente,

    Samuel dos Anjos

    sexta-feira, 7 de dezembro de 2012 16:59
  • Cara,

    Fiz um exemplo rápido aqui com o OleDb:

    public DataTable Teste()
            {
                DataTable dtRetorno = new DataTable();
                
                using (OleDbConnection olConnection = new OleDbConnection(strMinhaStringConexao)
                {
                    using (OleDbCommand olCommand = new OleDbCommand())
                    {
                        olConnection.Open();
    
                        olCommand.Connection = olConnection;
                        olCommand.CommandType = CommandType.Text;
                        olCommand.CommandText = "Select * from PROTOCOLOS";
    
                        using (OleDbDataAdapter olDtAdapter = new OleDbDataAdapter(olCommand))
                        {
                            olDtAdapter.Fill(dtRetorno);                        
                        }
                    }
                }
    
                return dtRetorno;
            }

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    sexta-feira, 7 de dezembro de 2012 17:44
  • Oi Alan, obrigado por se juntar ao tópico. Não fiz o teu ainda pq não entendi ao certo, fiz o de Samuel que mesmo assim não funcionou. O Erro é o mesmo:

    Valeu a força de vcs. Deve ser uma bobagem mas... rs


    Alam


    • Editado Alam Vilalves sexta-feira, 7 de dezembro de 2012 18:07 construcao
    sexta-feira, 7 de dezembro de 2012 18:06
  • Boa tarde provalvelmente em relação ao erro do Samuel , é o seguinte tentem isso :

    Criar uma propriedade publica que seja preenchida no construtor da mesma classe ficaria assim na BLL:

    namespace Intra.BLL

    {
       
    public class UsuarioBLL
       
    {

        private UsuarioDAL  objDAL {get;set;}

    public UsuarioBLL()
        {

    objDAL  = new UsuarioDAL();

    }


           
    public DataTable Listagem()
           
    {
               
    return objDAL.Listagem();
           
    }
       
    }
    }

    Espero ter ajudado


    Davi Murilo Referência Principal : Jesus que ilumina minha mente. Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo sexta-feira, 7 de dezembro de 2012 18:26
    sexta-feira, 7 de dezembro de 2012 18:26
  • Oi Alan, obrigado por se juntar ao tópico. Não fiz o teu ainda pq não entendi ao certo, fiz o de Samuel que mesmo assim não funcionou. O Erro é o mesmo:

    Valeu a força de vcs. Deve ser uma bobagem mas... rs


    Alam


    Seu método Listagem(); Já foi preenchido ANTES De tu executar este comando do DataSource ?

    È como se ainda não estivesse sido instânciada . . . Sempre tenho este erro, mas em diferentes situações.

    sexta-feira, 7 de dezembro de 2012 18:31
  • Pessoal sugiro que tenten o que falei , pois logicamente o que acontece é o seguinte

    Temos uma Classe BLL que está instaciando uma outra classe DAL dentro de um metodo apenas ou seja isso morre lá mesmo , agora

    se instaciarmos essa classe DAL em seu construtor , em qualquer parte do projeto que a BLL for instaciada automaticamente a classe DAL também será instaciada, porem entro da BLL.

    Tente o que disse  :

    Criar uma propriedade publica que seja preenchida no construtor da mesma classe ficaria assim na BLL:

    namespace Intra.BLL

    {
       
    public classUsuarioBLL
       
    {

        private UsuarioDAL  objDAL {get;set;}

    public UsuarioBLL()
        {

    objDAL  = new UsuarioDAL();

    }


           
    public DataTable Listagem()
           
    {
               
    returnobjDAL.Listagem();
           
    }
       
    }
    }

    Espero ter ajudado


    Davi Murilo Referência Principal : Jesus que ilumina minha mente. Referência Profissonal : http://www.tidm.com.br



    • Editado Davi Murilo sexta-feira, 7 de dezembro de 2012 18:37
    sexta-feira, 7 de dezembro de 2012 18:35
  • Davi, desculpe, não entendi muito bem. Eu sou iniciante em Asp.NET, você poderia explicar melhor? achei estranho não funcionar da forma que está pq quando acrescento camada de apresentação em WindowsForm o BLL funciona porém a camada ASP não.

    sexta-feira, 7 de dezembro de 2012 20:07
  • Boa noite

    O fato é o seguinte temos Ai a

    DAL

    BLL

    UI

    Na sua Classe DAL é feito o acesso ao banco até ai blz está ok.

    Na sua Classe BLL só server para validar e repassar em forma de parametros os dados vindo da cama UI , o fato é que na sua BLL

    não existe um construtor da própria BLL instanciando a DAL , pois sendo assim seu código na UI só iria funcionar se de fato você instancia-se a DAL coisa

    que sabemos na regra Tiers (Camadas) o usuário não saber que existe DAL .

    Daí então eu proponho o seguinte . Na sua BLL

    Só mude isso :

    Atualmente está assim :

    namespace Intra.BLL

    {
       
    public class UsuarioBLL
       
    {
           
    public DataTable Listagem()
           
    {
               
    UsuarioDAL obj = new UsuarioDAL();
               
    return obj.Listagem();
           
    }
       
    }
    }

    Mude para isso :

    namespace Intra.BLL

    {
       
    public class UsuarioBLL
       
    {

    private UsuarioDAL  obj {get;set;}

    public UsuarioBLL()

    {

    obj = new UsuarioDAL();

    }
           
    public DataTable Listagem()
           
    {
               
    return obj.Listagem();
           
    }
       
    }
    }

    E veja se irá funcionar , o fato de ser assim é que como existe agora um construtor ou inicializador de se mesma , Assim que a BLL for instanciada na UI automaticamente fará referencia a DAL e provavelmente seu código irá funcionar tente isso ok.

    Espero ter ajudado.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente. Referência Profissonal : http://www.tidm.com.br

    sábado, 8 de dezembro de 2012 00:09
  • oi Davi! não funcionou!! continuo com o mesmo problema.  Com o código que vc me deu, o WindowsForm também funciona, porém o asp.net dá o mesmo erro na chamada do método listagem, como na figura que eu postei. 
    segunda-feira, 10 de dezembro de 2012 13:09
  • Ok vamos analisar outro ponto .

    O que seria : using Intra.Modelos;

    E se possivel post ai como está a conexao com banco de dados  , deduzo que está como static a classe de conexao pois eu vejo isso na DAL :

    OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM usuario", Dados.StringDeConexao);

    Coloque o codigo completo da conexao por favor



    Davi Murilo Referência Principal : Jesus que ilumina minha mente. Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 10 de dezembro de 2012 13:48
  • Cara,

    Se quiser que eu dê uma olhada, me passa o projeto por e-mail zipado.

    samuelsgabi@outlook.com

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    terça-feira, 11 de dezembro de 2012 16:03
  • Cara,

    Deu certo o retorno que eu lhe dei por e-mail?

    Viu que o problema não era os métodos mas sim a master page?

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    terça-feira, 11 de dezembro de 2012 18:19
  • Davi, mas uma vez obrigado mas não resolveu o código que vc mandou.

    Samuel, te agradeço também, porém depois de ter enviado o projeto pra vc, não recebi email retorno algum.

    grato

    terça-feira, 11 de dezembro de 2012 18:26
  • Boa tarde na verdade eu estou pedindo o código da classe de conexão a banco de dados para analisarmos melhor , porém segundo o Samuel dos Anjos ele já identificou que o problema é na MasterPage , se ele puder postar o código da solução será legal.

    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo terça-feira, 11 de dezembro de 2012 18:43
    terça-feira, 11 de dezembro de 2012 18:42
  • Pessoal,

    Creio que o problema esteja resolvido. Confirma Vilalves?

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    terça-feira, 11 de dezembro de 2012 19:57
  • Bom dia caras! Obrigado hein! o problema foi resolvido sim.

    Davi!! Samuel pediu o projeto pra dar uma olhada e então identificou que o problema estava na master page que continha o GridView, porém, eu não sei, nem o Samuel soube explicar o porquê desse erro na MasterPage. No mesmo projeto, criamos uma nova página teste.aspx e incluimos o mesmo código que tava dando erro na MasterPage. Nesse caso o erro não ocorre, funciona normalmente. O mistério agora é saber o porquê o erro na MasterPage. rs.

    Que faço agora para finalizar o tópico? 

    quarta-feira, 12 de dezembro de 2012 12:34