Usuário com melhor resposta
Iniciando Asp.Net em 3 camadas

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;
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.
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(); } } }
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
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
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
-
-
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
-
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
{
cExecuta.Fill(dtRetorno);
}
return dtRetorno;}
E lembre-se, você precisa do DataBind() para Web também.
Atenciosamente,
Samuel dos Anjos
- Editado Samuel Rodrigues dos Anjos sexta-feira, 7 de dezembro de 2012 17:00
- Sugerido como Resposta Samuel Rodrigues dos Anjos sexta-feira, 7 de dezembro de 2012 17:44
-
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
- Sugerido como Resposta Samuel Rodrigues 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
-
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
-
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.
-
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
-
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.
-
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
-
-
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
-
-
-
-
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
-
-
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?