Fabio Mans
20/05/2009
Você assistiu a aula sobre Cache referente a este curso? Fez todos os procedimentos?
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante - Boa Tarde
Sim se não me engano é a aula 3 ou 4 que vc fala sobre isso fiz todos os Procedimentos, é que como eu quero adaptar o OUPTUT CACHE NA PAGINA produtos que está com objeto DropDownList para chamar categorias como abaixo
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="WebProdutos:dev_Categories" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True">
</asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="WebProdutos.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
Estou usando o VS2008 com NETFRAMEWORK 3.5 e um aplicativo para verificação de Cache para versão express do SqlServer deste link
http://code.google.com/p/sqlexpressprofiler/downloads/list
No Visual Studio 2008 ele dá erro qdo coloco na pagina
<%@ OutputCache Duration="99999" Shared="true" VaryByParam="CategoryID" SqlDependency="WebProdutos:dev_Categories" %>
E no DropDownList das categorias conforme source.aspx ácima em modo de execução, por exemplo qdo seleciono o segundo iten do DropDownList que está na base, mesmo que na sequência eu selecione uma outra categoria que não á do primeiro selecionado ele sempre retorna para o primeiro no DropDownList
Por exemplo
Eu seleciono - pela primeira vêz - Informática
na segunda vêz qdo seleciono eletrodomésticos ele retorna para Informática (ou o ítem selecionado pela primeira vêz) gostaria de saber o pq acontece isto
Observação deste modo abaixo e no aplicativo de profile citado ácima ele reconhece o cache profiling
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="WebProdutos:dev_Categories" %>
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Sem o cache funciona?
GOSTEI 0
Luiz Franco
20/05/2009
Funciona destas duas formas
Qdo Habilitado o AutoPost Back do DropDownList como igual á True (somente sem o Cache)
Qdo Desabilitado o AutoPost Back do DropDownList como igual á True (com o Cache)
como coloco o OutputCache na pagina do Vs2008 e uso o objeto DropDownlist para selecionar as subcategorias vinda da base para futuramente chamar os produtos qdo eu chegar na aula certa, não haveria alguma propriedade dentro do OutputCache que resolve-se este problema lembrando que ele na pagina não reconhece a propriedade Shared=true
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Você pode fazer via código, veja um exemplo.
CACHE DATASET
protected void btnOK_Click( object sender, EventArgs e )
{
gvwProdutos.DataSource = RecuperaProdutos();
gvwProdutos.DataBind();
}
private DataTable RecuperaProdutos()
{
if ( Cache["produtos"] == null )
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaProdutos();
}
else
{
lblMensagem.Text = "Dados do Cache";
return Cache["produtos"] as DataTable;
}
}
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto );
return dtProduto;
}
private void CacheProdutos( DataTable dtProduto )
{
if ( Cache["produtos"] == null )
{
Cache.Insert( "produtos", dtProduto, null, DateTime.Now.AddSeconds( 10 ), TimeSpan.Zero );
}
}
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante mas no caso como ficaria o mesmo exemplo para o DropDownList que tem a haver com as Categorias
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="False">
</asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Com o exemplo que te passei você não conseguiu implentar?
GOSTEI 0
Luiz Franco
20/05/2009
É que não entendi, o que vc me passou tem a haver com a table e classe products correto? como eu o faria na classe categoria que é aonde eu uso o dropdownlist como ti passei no source, é isso que não entendi o code que vc me passou tem a haver com a categorias ou products, pq o meu dropdownlist vem com os dados de categorias como vc pd vêr se precisar eu lhe passo um video que lhe farei até amanhã ok
GOSTEI 0
Fabio Mans
20/05/2009
Você recupera o ID da categoria no drop, e através deste ID recupera os produtos.
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}
==================================================================
É
que não entendi, o que vc me passou tem a haver com a table e classe
products correto? como eu o faria na classe categoria que é aonde eu
uso o dropdownlist como ti passei no source, é isso que não entendi o
code que vc me passou tem a haver com a categorias ou products, pq o
meu dropdownlist vem com os dados de categorias como vc pd vêr se
precisar eu lhe passo um video que lhe farei até amanhã ok
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante
Duas duvidas
Primeiro - Referente ao Evento SelectIndexChanged que me passou o que coloco dentro deste evento
Segundo - Como eu disse qdo coloco o OutputCache e o Autopostback=true qdo no dropdownlist eu primeiro seleciono em modo de execução - o 2 item, na hora que vou selecionar outro item qq ele volta no 2 item de novo mostrado no dropdownlist, já qdo o coloco como Autopostback=false ai o Cache dependency funciona normalmente como o meu outputcache está na pagina não tem que mexer em nenhuma propriedade desta linha
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
ou com o codigo que vc me passou mesmo o drop em autopostback= true irá resolver
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Para simplificar vamos fazer tudo via código OK.
Não vou explicar utilizando ObjectDataSource.
Primeiro, o autopostback vai dar um post e trazer todos os produtos referente aquela categoria através do evnedo SelectIndexChand.
Para isso você precisa criar um método que receba o id da categoria e retorno os produtos, pode ser um DataTable.
Referente ao cache vamos simplicar, faça diferente, esqueça a diretiva abaixo.
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
Crie um método que te retorne um DataTable com as categoria e para popular o DropCategoria faça o seguinte. Veja abaixo como colocar o drop na cache.
// 1 - Carrega o Grid verificando se o DataTable esta no cache.
private void BindBancos()
{
//drpBanco.DataSource = RecuperaBancos();
//drpBanco.DataTextField = "BANCO";
//drpBanco.DataValueField = "BANCO";
//drpBanco.DataBind();
//drpBanco.Items.Insert(0, new ListItem(" --- SELECIONE --- ", "0"));
}
// 2 - Verifica se existe o cache e retorna, caso contrário retorna do banco
private DataTable RecuperaBancos()
{
return Cache["B"] == null ? dtBC() : Cache["B"] as DataTable;
}
//3 - Consulta no banco e inclui os dados no banco
private DataTable dtBC()
{
DataTable dtB = DespesasBusiness.ConsultarBancos();
CacheB(dtB);
return dtB;
}
//4 - Adiciona o DataTable o Cache
private void CacheB(DataTable dtB)
{
if (Cache["B"] == null)
{
Cache.Insert("B", dtB, null, DateTime.Now.AddMinutes(60), TimeSpan.Zero);
}
}
Espero ter ajudado
==================================================================
====================================================================
Olá Fabio Galante
Duas duvidas
Primeiro - Referente ao Evento SelectIndexChanged que me passou o que coloco dentro deste evento
Segundo - Como eu disse qdo coloco o OutputCache e o Autopostback=true qdo no dropdownlist eu primeiro seleciono em modo de execução - o 2 item, na hora que vou selecionar outro item qq ele volta no 2 item de novo mostrado no dropdownlist, já qdo o coloco como Autopostback=false ai o Cache dependency funciona normalmente como o meu outputcache está na pagina não tem que mexer em nenhuma propriedade desta linha
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
ou com o codigo que vc me passou mesmo o drop em autopostback= true irá resolver
Fico no aguardo e desde já agradeço
GOSTEI 0
Devmedia
20/05/2009
Luiz,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
GOSTEI 0
Devmedia
20/05/2009
Luiz,
por falta de retorno estamos mudando o status do seu chamado para concluído. caso tnha mais duvidas sobre o assunto aqui tratato, por favor, post aqi mesmo q o consultor voltará a lhe atender.
GOSTEI 0
Luiz Franco
20/05/2009
Olá Primeiramente como eu faria esse metodo do datatable baseado no category.cs para sêr aproveitado no metodo e drpBanco (seria o id do dropdownlist, ddlCategorias, de meu source mais abaixo)
// 1 - Carrega o Grid verificando se o DataTable esta no cache.
private void BindBancos()
{
//drpBanco.DataSource = RecuperaBancos();
//drpBanco.DataTextField = "BANCO";
//drpBanco.DataValueField = "BANCO";
//drpBanco.DataBind();
//drpBanco.Items.Insert(0, new ListItem(" --- SELECIONE --- ", "0"));
}
// 2 - Verifica se existe o cache e retorna, caso contrário retorna do banco
private DataTable RecuperaBancos()
{
return Cache["B"] == null ? dtBC() : Cache["B"] as DataTable;
}
//3 - Consulta no banco e inclui os dados no banco
private DataTable dtBC()
{
DataTable dtB = DespesasBusiness.ConsultarBancos();
CacheB(dtB);
return dtB;
}
//4 - Adiciona o DataTable o Cache
private void CacheB(DataTable dtB)
{
if (Cache["B"] == null)
{
Cache.Insert("B", dtB, null, DateTime.Now.AddMinutes(60), TimeSpan.Zero);
}
}
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="WebProdutos:dev_Categories" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="False">
</asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="Devmedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Luiz você diz o DataTable?
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto );
return dtProduto;
}
[]'s
GOSTEI 0
Luiz Franco
20/05/2009
Sim seria o datatable, só que na verdade o cache é para sêr feito no dropdown da lista categoryes.cs e não produtos por isso que estou talvez ainda meio confuso
Vou fazer o seguinte vou verificar com calma mesmo que prosseguindo o curso sobre o que vc me orientou e assim que eu testar ti retorno ok, mas caso seja possivel fazer um video explicando sobre isso me auxiliaria muito para a drop down categorias
Fico no aguardo e desde ja agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Tente fazer, caso precise eu gravo.
GOSTEI 0
Devmedia
20/05/2009
Luiz,
conseguiu resolver o problema? O consultor precisa gravar o video?
GOSTEI 0
Luiz Franco
20/05/2009
Se puder fazer esse vídeo para saber se é isso mesmo o que preciso fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Vou gravar o vídeo e te retorno.
Fabio
GOSTEI 0
Fabio Mans
20/05/2009
Luiz vou preparar o vídeo neste sábado, mas antes disto tem algo que eu possa ajudar?
Você nunca criou um método que retorna um DataTable?
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Não que eu me lembre não
se for possivel fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Vou montar o exemplo hoje e te passo hoje.
Será um exemplo como o código abaixo.
CACHE DATASET
protected void btnOK_Click( object sender, EventArgs e )
{
gvwProdutos.DataSource = RecuperaProdutos();
gvwProdutos.DataBind();
}
private DataTable RecuperaProdutos()
{
if ( Cache["produtos"] == null )
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaProdutos();
}
else
{
lblMensagem.Text = "Dados do Cache";
return Cache["produtos"] as DataTable;
}
}
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto );
return dtProduto;
}
private void CacheProdutos( DataTable dtProduto )
{
if ( Cache["produtos"] == null )
{
Cache.Insert( "produtos", dtProduto, null, DateTime.Now.AddSeconds( 10 ), TimeSpan.Zero );
}
}
GOSTEI 0
Fabio Mans
20/05/2009
Luiz segue o vídeo onde mostro como criar um DataTable e manter em Cache.
http://cid-efe30508f7cc47cb.skydrive.live.com/self.aspx/DevMedia/Cache.rar
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante - Boa Tarde
Bem vi o video sobre cache que vc me enviou, bem vamos vêr se em minhas novas duvidas e algumas respostas mais esclarecidas para mim após o video se eu entendi e como usar com dropdownlist e autopostback = true do dropdownlist
Bem primeiramente pelo que entendi utilizando-se o code-behind não vai precisar desta linha no source da pagina.aspx ou products.aspx
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
Isso?
Em relação ao codigo pelo que entendi (coloquei meu entendimento/duvidas via comentario na frente do codigo)
protected void btnOK_Click( object sender, EventArgs e ) //Aqui qdo se da o clique ele procura o DataTable RecuperaProdutos()?
{
gvwProdutos.DataSource = RecuperaProdutos();
gvwProdutos.DataBind();
}
//Mas no caso ácima uma duvida - Como recuperar de um DropDownList com autopostback = true como a linha abaixo do source da pagina produtos.aspx no lugar do evento btnOk_Click utilizar o autopostback=true
Aqui o source da minha pagina produtos.aspx
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"> (neste caso o AutoPostBack é igual true)
</asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
//Continuando o code-behind
private DataTable RecuperaProdutos() //Metodo que Retorna o Cache ou DataTable
{
if ( Cache["produtos"] == null ) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaProdutos();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["produtos"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto ); //Aqui chama e preenche o metodo CacheProdutos somente na primeira vêz ou todas vezes?
return dtProduto;
}
private void CacheProdutos( DataTable dtProduto )
{
if ( Cache["produtos"] == null )
{
Cache.Insert( "produtos", dtProduto, null, DateTime.Now.AddSeconds( 10 ), TimeSpan.Zero );//Aqui que cria Cache["produtos"]?
}
}
Fico no aguardo e desde já agredeço
GOSTEI 0
Fabio Mans
20/05/2009
Isso mesmo, estamos trabalhando de forma diferente em relação ao Cache.
Sim basta dar um clique duplo no Drop que ele vai criar o método.
Se você debugar perceba que ele passa somente uma vez no momento de criar o DataTable.
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante Mans
Então pelo que entendi
A) Não precisa mais desta linha de codigo no source.aspx da pagina produtos.aspx
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
Isso?
B)
Em relação ao codigo pelo que entendi (colocar o codigo abaixo dentro do evento ao clicar duas vezes no drop down list com autopostback=true e substituir a origem do carregamento)
protected void evento dropdownlist( object sender, EventArgs e ) //Aqui qdo se da o clique ele procura o DataTable RecuperaProdutos()?
{
ddlCategorias.DataSource = RecuperaProdutos();
ddlCategorias.DataBind();
}
E aproveitando só mais uma terceira questão por curiosidade, via código como vc me explicou o resultado em cache e cachedependency seria o mesmo se a table do datatable fosse vinda de uma base MySql versão connector 5.0?
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Olá Fabio Galante Mans
Então pelo que entendi
A) Não precisa mais desta linha de codigo no source.aspx da pagina produtos.aspx
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
Isso?
ISSO PERFEITO, MUDAMOS A FORMA DE CACHE
B)
Em relação ao codigo
pelo que entendi (colocar o codigo abaixo dentro do evento ao clicar
duas vezes no drop down list com autopostback=true e substituir a
origem do carregamento)
protected
void evento dropdownlist( object sender, EventArgs e ) //Aqui qdo se da
o clique ele procura o DataTable RecuperaProdutos()?
{
ddlCategorias.DataSource = RecuperaProdutos();
ddlCategorias.DataBind();
}
E
aproveitando só mais uma terceira questão por curiosidade, via código
como vc me explicou o resultado em cache e cachedependency seria o
mesmo se a table do datatable fosse vinda de uma base MySql versão
connector 5.0?
Fico no aguardo e desde já agradeço
COM CACHE VOCÊ PODE FAZER O QUE FIZ NO VÍDEO, CACHEDEPENDENCY É SÓ PARA MS SQL.
ESPERO TER AJUDADO
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante
então agora já retornando a aula no caso o datatable deste cache teria que chamar a procedure da classe dev_SelectAllCategory no data table
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto ); //Aqui chama e preenche o metodo CacheProdutos somente na primeira vêz ou todas vezes?
return dtProduto;
}
se sim como eu coloco essa procedure no lugar da linha
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
dentro do data adapter abaixo eu coloco o source da pagina products onde se faz o dropdown cache das categorias + a parte da classe category.cs chamada pelo objeto datasource do mesmo
source pagina produtos.aspx
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<%@ OutputCache Duration="99999" VaryByParam="CategoryID" SqlDependency="DevMedia:dev_Categories" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="False">
</asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
parte da classe category.cs chamada neste object datasource ácima
/// <summary>
/// Seleciona Todas as Categorias do Banco de Dados
/// </summary>
/// <returns></returns>
[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select,true)]
public static List<Category> SelectCategory()
{
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
//Inicializar Comando
SqlConnection con = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand("dev_SelectAllCategory", con);
cmd.CommandType = CommandType.StoredProcedure;
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
List<Category> results = new List<Category>();
using (con)
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
results.Add(new Category(reader));
}
con.Close();
return results;
}
}
Fico no aguardo e desde já agradeço
A
GOSTEI 0
Fabio Mans
20/05/2009
Olá Luiz o que te mostrei deve ser utilizado codificando, através de ObjectDataSource eu acredito que não deve ser feito. Eu montei este curso da Loja já faz quase dois anos, eu não utilizo mais o ObjectDataSource, tudo que faço é codificando.
dentro
do data adapter abaixo eu coloco o source da pagina products onde se
faz o dropdown cache das
categorias + a parte da classe category.cs
chamada pelo objeto datasource do mesmo.
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante
mas neste metodo abaixo como eu mudaria o dataadapter para ele reconhecer a procedure Dev_SelecAllCategory ou não tem como
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True" );
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto ); //Aqui chama e preenche o metodo CacheProdutos somente na primeira vêz ou todas vezes?
return dtProduto;
}
E aproveitando para um objeto do tipo Menu do VS2008 ele também pode sêr preenchido com o databind
protected void evento menu( object sender, EventArgs e ) //Aqui qdo se da o clique ele procura o DataTable RecuperaProdutos()?
{
menu1.DataSource = RecuperaProdutos();
menu1.DataBind();
}
GOSTEI 0
Fabio Mans
20/05/2009
Luiz tem sim, veja abaixo
private DataTable SelecionaProdutos(){
DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(@"Data Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelecAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
CacheProdutos(da);
}
}
return ds.Tables[0];
}
========================================================================
Nunca fiz Menu com DataSource faz é possível sim. Sempre faço com XML
protected void Page_Load(object sender, EventArgs e)
{
Menu1.DataSource = SelecionaProdutos();
Menu1.DataBind();
}
Espero ter ajudado.
SqlConnection cnDados = new SqlConnection( @"Data
Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True"
);
SqlDataAdapter daProduto = new SqlDataAdapter( "Dev_SelecAllCategory", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto ); //Aqui chama e preenche o metodo CacheProdutos somente na primeira vêz ou todas vezes?
return dtProduto;
}
Olá Fabio Galante
mas neste metodo abaixo como eu mudaria o dataadapter para ele reconhecer a procedure Dev_SelecAllCategory ou não tem como
private DataTable SelecionaProdutos()
{
SqlConnection cnDados = new SqlConnection( @"Data
Source=ANDRE_DESKTOP;Initial Catalog=dbDados;Integrated Security=True"
);
SqlDataAdapter daProduto = new SqlDataAdapter( "SELECT * FROM TBPRODUTO ORDER BY DESCRICAO", cnDados );
DataTable dtProduto = new DataTable();
daProduto.Fill( dtProduto );
CacheProdutos( dtProduto ); //Aqui chama e preenche o metodo CacheProdutos somente na primeira vêz ou todas vezes?
return dtProduto;
}
E aproveitando para um objeto do tipo Menu do VS2008 ele também pode sêr preenchido com o databind
protected void evento menu( object sender, EventArgs e ) //Aqui qdo se da o clique ele procura o DataTable RecuperaProdutos()?
{
menu1.DataSource = RecuperaProdutos();
menu1.DataBind();
}
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante veja como ficou o teste do Cache que fiz e veja como ficou apesar de têr ocorrido uma exceção e essa é a nova duvida que coloco no post mais abaixo
No Source da pagina produtos.aspx ficou assim
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"
onselectedindexchanged="ddlCategorias_SelectedIndexChanged">
</asp:DropDownList>
<asp:Label ID="lblMensagem" runat="server"></asp:Label>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
No code-behind desta pagina ficou assim
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
public partial class produtos : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
//Response.Write(ddlCategorias.SelectedValue);
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
}
Só que ao executar o select do dropdownlist ddlcategorias nesta pagina ocorreu á Seguinte Exception
System.InvalidOperationException was unhandled by user code
Message="DataSource e DataSourceID estão definidos em 'ddlCategorias'. Remova uma definição."
Source="System.Web"
StackTrace:
em System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView()
em System.Web.UI.WebControls.DataBoundControl.GetData()
em System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e)
em System.Web.UI.WebControls.ListControl.PerformSelect()
em System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
em produtos.ddlCategorias_SelectedIndexChanged(Object sender, EventArgs e) na d:\MEUSASPNETWEBSITES\VS2008\WebProdutos\produtos.aspx.cs:linha 28
em System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
em System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
em System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
em System.Web.UI.Page.RaiseChangedEvents()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
Como eu corrijo isso ? no codigo ou no source.aspx ácima inserido e qual seria a correção caso possa me reenviar fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Luiz você tem que codificar, remova o DataSourceID do Drop e informe que o datasource será SelecionaCategorias() via código.
Espero ter ajudado.
Fabio
<%@ Page Language="C#" MasterPageFile="~/Home.master" AutoEventWireup="true" CodeFile="produtos.aspx.cs" Inherits="produtos" Title="Untitled Page" ViewStateEncryptionMode="Always" EnableViewStateMac="true" ValidateRequest="true" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server" DataSourceID="dsCategory"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"
onselectedindexchanged="ddlCategorias_SelectedIndexChanged">
</asp:DropDownList>
<asp:Label ID="lblMensagem" runat="server"></asp:Label>
<asp:ObjectDataSource ID="dsCategory" runat="server"
OldValuesParameterFormatString="original_" SelectMethod="SelectCategory"
TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource>
</asp:Content>
No code-behind desta pagina ficou assim
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
public partial class produtos : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
//Response.Write(ddlCategorias.SelectedValue);
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
}
Só que ao executar o select do dropdownlist ddlcategorias nesta pagina ocorreu á Seguinte Exception
System.InvalidOperationException was unhandled by user code
Message="DataSource e DataSourceID estão definidos em 'ddlCategorias'. Remova uma definição."
Source="System.Web"
StackTrace:
em System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView()
em System.Web.UI.WebControls.DataBoundControl.GetData()
em System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e)
em System.Web.UI.WebControls.ListControl.PerformSelect()
em System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
em
produtos.ddlCategorias_SelectedIndexChanged(Object sender, EventArgs e)
na d:\MEUSASPNETWEBSITES\VS2008\WebProdutos\produtos.aspx.cs:linha 28
em System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
em System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
em System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
em System.Web.UI.Page.RaiseChangedEvents()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
Como
eu corrijo isso ? no codigo ou no source.aspx ácima inserido e qual
seria a correção caso possa me reenviar fico no aguardo e desde já
agradeço
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante - bem vamos por partes
A)Remove o DataSource do Drop e do Source.aspx da pagina produtos.aspx
Veja se está correto:
<asp:Content ID="Content1" ContentPlaceHolderID="ContentCenter" Runat="Server">
<asp:DropDownList ID="ddlCategorias" runat="server"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"
onselectedindexchanged="ddlCategorias_SelectedIndexChanged">
</asp:DropDownList>
<asp:Label ID="lblMensagem" runat="server"></asp:Label>
</asp:Content>
B)Via Code-Behind eu tive que acrescentar no evento page load da pagina a chamada do metodo SelecionaCategorias() ou RecuperaCategorias() para que na primeira vêz que fosse carregada a pagina já mostra-se o conteúdo da dropdownlist como mostrado abaixo no code-behind
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
ddlCategorias.DataSource = SelecionaCategorias();
ddlCategorias.DataBind();
//Response.Write(ddlCategorias.SelectedValue);
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
C)Com as mudanças no procedimento e no codigo ao executar a pagina produtos.aspx carregou o dropdown normalmente e caso no pageload no lugar de SelecionaCategorias() fosse RecuperaCategorias() realmente detecta via codigo para que a segunda chamada em diante seja cache, porém se no dropdown do source da pagina produtos.aspx a sua propriedade AUTOPOSTBACK for igual a true, ele dá o mesmo resultado do de antes ou seja
C.1)Clico no segundo item do drop down - exemplo - SitesProntos e ele faz o postback na primeira vez até ai normal
C.2)Mas na segunda vez que eu clico por exemplo em outro ítem da seleção exemplo - Coletânea e automaticamente ele faz o postback da pagina ele novamente volta a carregar no drop down o resultado do primeiro ítem escolhido ou seja:SitesProntos e não Coletânea (ou seja o código nesta parte não adiantou pois se criou o mesmo efeito do procedimento antigamente executado) Ele só não faz este mesmo efeito qdo a propriedade do dropdown ddl_categorias autopostback estiver setada como false do contrário faz ou seja parece que não tem nada a haver com o cache neste caso como eu resolveria isto
Caso precise em breve crio um video assim que eu receber soft camtasia 6.02 que comprei e esta pra chegar pra vc ter uma ideia do que está acontecendo por enquanto até eu saber como resolveria esse problema que agora pelo visto é no autopostback da pagina vou deixar a propriedade autopostback do ddl categorias como false até conseguir corrigir este problema ou achar uma solução mesmo assim fico agradecido pela aula do cache em codigo esperamos conseguir em breve resolver esse problema do autopostback
fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Faltou no Page_Load o if(!IsPostBack) lembra?
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio
Nesse caso no code-behind como ficaria esse if(!isPostBack) no caso em qual ou quais eventos eu utilizaria para dar certo a correta recuperação da ddl_categorias com o uso do cache
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
protected void Page_Load(object sender, EventArgs e)
{
//Seu drop vai ser carregado somente a primeira vez que página for carregada
if (!IsPostBack)
{
ddlCategorias.DataSource = SelecionaCategorias(); //Aqui o primeiro usuário vem do banco, o segundo tem que vir do cache
ddlCategorias.DataBind();
}
}
GOSTEI 0
Luiz Franco
20/05/2009
Olá executei os procedimentos como pd observar no source e no code
produtos.aspx
<asp:DropDownList ID="ddlCategorias" runat="server"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"
onselectedindexchanged="ddlCategorias_SelectedIndexChanged">
</asp:DropDownList>
code-behind
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlCategorias.DataSource = SelecionaCategorias();
ddlCategorias.DataBind();
//Response.Write(ddlCategorias.SelectedValue);
}
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
Porem agora na primeira vez ele carrega a pagina já na hora que dou o autopostback na ddl_categorias os dados da lista categorias da ddl_categorias somem e não aparece nenhum dado na lista
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Faz um Debug na aplicação e compara com o vídeo onde gravei, tem algum erro, não pode ficar sem os dados.
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante
Ainda não fiz o debug ou comparei o video, mas dando uma refletida e verificando o código vc sabe que o valor do campo grupo solicitado pela minha procedure dev_SelectallCategory vem da querystring sessao que é repassa o parametro para a string Grupo não seria isso ou seja no segundo postback que ele dá não seria a falta deste parametro se fôr como eu resolveria isto
veja
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
public partial class produtos : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];//Recupera via querystring o parametro sessao passando a string Grupo
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlCategorias.DataSource = SelecionaCategorias();
ddlCategorias.DataBind();
//Response.Write(ddlCategorias.SelectedValue);
}
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);//No datatable recupera a string Grupo ou seja se faltar esse valor não seria esse o motivo por ficar em branco ou dar aquele erro no segundo postback
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
protected void btnBuscar_Click(object sender, EventArgs e)
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
}
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fábio Galante ao fazer alguns testes, inclusive testes fixos sem o uso da base de dados, datatable ou cache, comentando parte do codigo abaixo e criando uma exibição estática como o video em anexo mostra não mudou em nada..acredito que seja algo referente ao DDlCategorias.Selected.Item ou ddlCategorias.Selected.Value
o codigo para teste fixo como o exemplo do video segue abaixo
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
public partial class produtos : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// ddlCategorias.DataSource = SelecionaCategorias();
// ddlCategorias.DataBind();
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net","teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
//Response.Write(ddlCategorias.SelectedItem);
}
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net", "teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
// ddlCategorias.DataSource = RecuperaCategorias();
//ddlCategorias.DataBind();
//Response.Write(ddlCategorias.SelectedItem);
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
//ddlCategorias.DataSource = RecuperaCategorias();
//ddlCategorias.DataBind();
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
protected void btnBuscar_Click(object sender, EventArgs e)
{
//ddlCategorias.DataSource = RecuperaCategorias();
// ddlCategorias.DataBind();
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net", "teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
}
}
Fico no aguardo e caso possa me ajudar desde já agradeço
[#VIDEO-143#]
GOSTEI 0
Luiz Franco
20/05/2009
Aqui finalmente o link do Video á duvida que me falta veja se agora consegue visualizar fico no aguardo e desde já agradeço
http://www.screencast.com/t/9FSHoKgeF
e só para ficar melhor diagramado o codigo modificado um pouco do qual falo no video e que o usei para testes utilizando o VS2008
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
public partial class produtos : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
string Grupo = HttpContext.Current.Request.QueryString["sessao"];
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// ddlCategorias.DataSource = SelecionaCategorias();
// ddlCategorias.DataBind();
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net","teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
//Response.Write(ddlCategorias.SelectedItem);
}
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net", "teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
// ddlCategorias.DataSource = RecuperaCategorias();
//ddlCategorias.DataBind();
//Response.Write(ddlCategorias.SelectedItem);
}
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e)
{
//ddlCategorias.DataSource = RecuperaCategorias();
//ddlCategorias.DataBind();
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
protected void btnBuscar_Click(object sender, EventArgs e)
{
//ddlCategorias.DataSource = RecuperaCategorias();
// ddlCategorias.DataBind();
ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net", "teste1"));
ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
}
}
GOSTEI 0
Luiz Franco
20/05/2009
Ola Fábio - criei uma outra webapplication project no VS2008 só para testar o DropDownList em conjunto com a table Dev_categorias e a verificação do cache - veja o resultado em um outro link de video anexo como também o último source e codigo utilizado neste video
link do nv video sobre a minha duvida
http://www.screencast.com/t/mvCPFsGOWY
source.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TesteDropDownList._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddlCategorias" runat="server"
DataTextField="Title" DataValueField="CategoryID" AutoPostBack="True"
>
</asp:DropDownList>
<asp:Button ID="btnBuscar" runat="server" Text="Buscar"
/>
<asp:Label ID="lblMensagem" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
code-behind
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;
namespace TesteDropDownList
{
public partial class _Default : System.Web.UI.Page
{
string _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString;
//string Grupo = HttpContext.Current.Request.QueryString["sessao"];
string Grupo = "Produtos";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//ddlCategorias.Items.Add(new ListItem("Componentes Asp.Net", "teste1"));
// ddlCategorias.Items.Add(new ListItem("Sites Prontos", "teste2"));
// ddlCategorias.Items.Add(new ListItem("Templates", "teste3"));
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
else
{
ddlCategorias.DataSource = RecuperaCategorias();
ddlCategorias.DataBind();
}
}
private DataTable RecuperaCategorias() //Metodo que Retorna o Cache ou DataTable
{
if (Cache["categorias"] == null) //SE Cache Produtos for nulo ou primeira vez chama metodo SelecionaProdutos
{
lblMensagem.Text = "Dados do Banco de dados";
return SelecionaCategorias();
}
else //Retorna Cache
{
lblMensagem.Text = "Dados do Cache";
return Cache["categorias"] as DataTable;//Duvida Cache["produtos"] foi criado no metodo CacheProdutos?
}
}
private DataTable SelecionaCategorias()
{
//DataSet ds = new DataSet("Category");
using (SqlConnection cn = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("Dev_SelectAllCategory", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daCategorias = new SqlDataAdapter(cmd);
//Initialize parameters
cmd.Parameters.AddWithValue("@Grupo", Grupo);
DataTable dtCategorias = new DataTable();
daCategorias.Fill(dtCategorias);
CacheCategorias(dtCategorias);
return dtCategorias;
}
}
//return ds.Tables[0];
}
private void CacheCategorias(DataTable dtCategoria)
{
if (Cache["categorias"] == null)
{
Cache.Insert("categorias", dtCategoria, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);//Aqui que cria Cache["categorias"]?
}
}
}
}
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Luiz eu assisti seu vídeo, só queria saber se você sabe qual o conceito de Cache, me diga por que devemos colocar um DataTable em Cache?
É o seguinte imagine 100 usuários acessando o seu site, nesta caso será executado 100 vezes a mesma
Query, o Cache irá impedir, será realizado somente a primeira vez até durar o tempo do Cache, por isso o exemplo que você fez no vídeo não tem muito a ver com o Cache.
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
Olá Fabio Galante eu sei que o segundo ou último video do TesteDropDownList não tem nada a haver com o cache...mas perceba quando eu mostro este video que qdo se usa o objeto dropdownlist (acredito eu que só acontecerá com ele) se vc usa o metodo SelecionaCategorias() que é o datatable que vai direto se não me engano na busca da table ele volta corretamente no ítem mas observe que no primeiro exemplo do video eu uso apenas no codigo o selecionacategorias() sem mencionar a rotina de decisão do cache RecuperaCategorias() a partir do momento se vc olhar o video e verificar que eu uso este metodo ele, pelo menos no dropdownlist sempre retorna para o primeiro ítem da lista
é por isso que postei o video ....e é por isso que eu acho que isso da seleção do item de voltar para o primeiro item desta vêz deve ter a haver qdo é acionado o cache, antes eu não achava isso
Bem se não der vou qdo trabalhar com o objeto dropdownlist usá-lo sem o cache pois direto na base esta funcionando
fazer o que tentei de td que é jeito mas não deu certo a não sêr direto no datatable SelecionaCategoria() e não pelo RecuperaCategoria() que tem a haver com a decisão do cache pelo visto ou que ativa a decisao do cache
aproveitando qtos tables pde ser usada numa mesma base para SqlCacheDependency
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
20/05/2009
Luiz você pode utilizar em quantas tabelas você precisar.
http://www.dotnetheaven.com/Uploadfile/mosessaur/sqlcachedependency03282006052528AM/sqlcachedependency.aspx?ArticleID=a92bdcea-1570-41dd-945b-47fcbaef16a2
Faça sem o Cache, depois voltamos a este assunto, assim você não para o curso.
Fabio
GOSTEI 0
Luiz Franco
20/05/2009
oK Fabio mesmo assim obrigado, vou fazer deste jeito provisoriamente só qdo usar os objetos drop down utilizarei da forma que disse ou seja só procurando o datatable e não o cache que no meu teste deu certo mas desta forma se eu souber de algo ou vc souber se puder me repasse, mas lembre-se pelo visto isso acontece só no dropdownlist pois pelo que vi em seu video sobre cache no gridview e outros objetos como datalist acho que nestes não retorna o cache no primeiro registro ao fazer o postback e sim no registro corrente
Bem fico no aguardo e desde já agradeço vou continuar o curso mas se souber de uma solução me avise se eu souber ti dou um toque
GOSTEI 0