Duvidas Relativo á aula XI do curso

20/05/2009

Olá Fabio Galante - Boa Tarde      Como eu não estou recebendo as categorias em produtos via webusercontrol Menu.asxc e sim via dropdownlist dentro da pagina de Produtos do meu front end gostaria de saber como usar corretamente a diretiva do CacheDependency já que a coloquei desta forma direto na pagina, já que não usarei o controle mas o dropdownlist e deu o erro citado mais abaixo   Aqui o Source da Pagina produtos.aspx do frontend   <%@ 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" Shared="true" 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="DevMedia.ECommerce.Category"></asp:ObjectDataSource> </asp:Content> Aqui o Erro apresentado ao executar a webapplication no VS2008   Error 13 A diretiva 'outputcache' não oferece suporte para o atributo 'shared' em uma página. D:\MEUSASPNETWEBSITES\VS2008\Store\produtos.aspx 3      Aqui a config de meu webconfig   <connectionStrings> <add name="StoreString" connectionString="Data Source=LUIZVIDEO\SQLEXPRESS;Initial Catalog=WebProdutos;Persist Security Info=True;User ID=userWebProdutos;Password=rolu27;" providerName="System.Data.SqlClient"/> <remove name="LocalSqlServer"/> <add name="LocalSqlServer" connectionString="Data Source=LUIZVIDEO\SQLEXPRESS;Initial Catalog=WebProdutos;Persist Security Info=True;User ID=userWebProdutos;Password=rolu27;" providerName="System.Data.SqlClient"/> <!--<add name="StoreString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DevStore.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>--> <add connectionString="server=mysqlserver.com;database=mysqldatabase;user id=mysqlid;pwd=mysqlpwd" name="SimpleProviderConnectionString" providerName="MySql.Data.MySqlClient"/> </connectionStrings> <system.web> <!-- INCIO CONFIGS MYSQLSITEMAPPROVIDER --> <roleManager enabled="true"/> <authentication mode="Forms"/> <caching> <sqlCacheDependency enabled="true" pollTime="15000"> <databases> <add name="WebProdutos" connectionStringName="StoreString"/> </databases> </sqlCacheDependency> </caching> <siteMap defaultProvider="siteMapProvider" enabled="true"> <providers> <clear/> <add name="siteMapProvider" type="Simple.Providers.MySQL.MysqlSiteMapProvider" connectionStringName="SimpleProviderConnectionString" applicationName="WebProdutos" description="MySQL site map provider" securityTrimmingEnabled="true"/> </providers> </siteMap> <!-- FIM CONFIGS MYSQL SITEMAPPROVIDER --> Aqui as minhas SP atuais    SP - SelectAllCategory ALTER PROCEDURE [dbo].[dev_SelectAllCategory] ( @Grupo VarChar(150) ) AS SELECT CategoryID, Title FROM dbo.dev_Categories Where Grupo = @Grupo ORDER BY Title SET NOCOUNT ON RETURN SP CategorySelect   ALTER PROCEDURE [dbo].[dev_CategorySelect] ( @Id Int ) AS SELECT CategoryId, Grupo, Title FROM dev_Categories WHERE CategoryId = @Id   Que tem a haver com a pagina products ou produtos.aspx do frontend   E aqui a minha classe atual Category.cs     using System; using System.Data; using System.Configuration; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Web.Configuration; namespace DevMedia.ECommerce { /// <summary> /// Representa a Categoria de um Produto ou Servio /// e contem mtodos para trabalhar com a Categoria /// </summary> [System.ComponentModel.DataObject] public class Category { private static readonly string _connectionString; private int _id; //private string _grupo; private string _title; public int CategoryID { get { return _id; } set { _id = value; } } //public string Grupo ///{ //get { return _grupo; } //set { _grupo = value; } /// } public string Title { get { return _title; } set { _title = value; } } static Category() { _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString; } public Category(SqlDataReader reader) { _id = (int)reader["CategoryID"]; //_grupo = (string)reader["Grupo"]; _title = (string)reader["Title"]; } /// <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; } } /// <summary> /// Seleciona Todas as Categorias do Banco de Dados /// Baseado na SubSessao em Servios /// </summary> /// <returns></returns> [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)] public static List<Category> Services() { string Grupo = HttpContext.Current.Request.QueryString["subsessao"]; //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; } } /// <summary> /// Seleciona uma Categoria por Category ID /// </summary> /// <param name="CategoryID"></param> /// <returns></returns> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] public static Category SelecById(int CategoryID) { //Inicializar o Command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategorySelect", con); cmd.CommandType = CommandType.StoredProcedure; //Inicializar Parameters p/ Evitar SqlInjection cmd.Parameters.AddWithValue("@Id", CategoryID); //Criar Variavel para Retorno de Resultados Category result = null; using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) result = new Category(reader); } con.Close(); return result; }//<summary> //Create a new category //</summary> //<param name="parentId"></param> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)] public static void Insert(string grupo, string title) { //Initialize command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryInsert ", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@Grupo", grupo); cmd.Parameters.AddWithValue("@Title", title); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); } /// <summary> /// Update numa CategoryID Existente /// </summary> /// <param name="CategoryId"></param> /// <param name="Title"></param> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)] public static void Update(int CategoryId, string Title) { //Inicializar o Command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryUpdate", con); cmd.CommandType = CommandType.StoredProcedure; //Inicializar Parameters p/ Evitar SqlInjection cmd.Parameters.AddWithValue("@Id", CategoryId); cmd.Parameters.AddWithValue("@Title", Title); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); } /// <summary> /// Delete a category /// </summary> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)] public static void DeleteCat(int CategoryId) { // Initialize command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryDelete", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CategoryId", CategoryId); using (con) { con.Open(); cmd.ExecuteNonQuery(); } } } } Fico no aguardo e desde já agradeço para saber  como eu teria que adaptar e resolver este erro da diretiva Shared na pagina produtos.aspx  
Luiz Franco

Luiz Franco

Curtidas 0

Respostas

Fabio Mans

Fabio Mans

20/05/2009

Você assistiu a aula sobre Cache referente a este curso? Fez todos os procedimentos?
GOSTEI 0
Luiz Franco

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

Fabio Mans

20/05/2009

Sem o cache funciona?
GOSTEI 0
Luiz Franco

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

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

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

Fabio Mans

20/05/2009

Com o exemplo que te passei você não conseguiu implentar? 
GOSTEI 0
Luiz Franco

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

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

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

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

Devmedia

20/05/2009

Luiz,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
GOSTEI 0
Devmedia

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

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

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

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

Fabio Mans

20/05/2009

Tente fazer, caso precise eu gravo.
GOSTEI 0
Devmedia

Devmedia

20/05/2009

Luiz,
conseguiu resolver o problema? O consultor precisa gravar o video?
GOSTEI 0
Luiz Franco

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

Fabio Mans

20/05/2009

Vou gravar o vídeo e te retorno.

Fabio
GOSTEI 0
Fabio Mans

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fabio Mans

20/05/2009

Faltou no Page_Load o if(!IsPostBack) lembra?
GOSTEI 0
Luiz Franco

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

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

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

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

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

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

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

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

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

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

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

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
POSTAR