Avatar billede pumpin Nybegynder
09. april 2006 - 22:42 Der er 30 kommentarer og
1 løsning

problemer med dataset

hej eksperter

Jeg har lavet en menu som ligger i en uder control og bliver vist 2 steder på siden som bliver loadet hver gang siden loader, til dels fordi jeg bruger <a> som links og derfor aldrig laver et post back og derfor ikke kan teste på om siden ispostback.

demon stration af hvor langsom siden er www.href.dk

derfor tænkte jeg at jeg ville ligge den i et dataset eller dataTable og så bare databinde fra den.. til dette bruger jeg denne kode :

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GetLinks();
        }
       
    }

    private void GetLinks()
    {

        DataTable Dt = new DataTable();
        string SQL = "SELECT * FROM links";
        MySqlConnection objConn = new MySqlConnection(ConfigurationManager.AppSettings["ConnString"]);
        MySqlCommand objCmd = new MySqlCommand(SQL, objConn);
        MySqlDataAdapter Da = new MySqlDataAdapter(objCmd);

       
        objConn.Open();
        Da.Fill(Dt);
        objConn.Close();
        RepeaterMenu.DataSource = Dt;
        RepeaterMenu.DataBind();
       
     
    }

men når jeg debugger den kan jeg se at jeg stadig udfylder Dt fra DB via fill hvergang jeg trykker på et link. Så mit spørgsmår er hvordan undgår jeg dette.. evt ved at lave en function som udfylder og retunere en dataTabel og en som bare databinder den eksisterende dataTabel til min RepeaterMenu ??
Avatar billede driis Nybegynder
09. april 2006 - 23:00 #1
En oplagt mulighed kunne være at placere din Dt i Cache og så kun hente fra DB hvis den ikke findes i caches.
Avatar billede pumpin Nybegynder
09. april 2006 - 23:21 #2
det lyder svært. men hvordan gøres det ? det kunne være rart hvis det kunne oppe mit ites load tider lidt
Avatar billede dr_chaos Nybegynder
10. april 2006 - 08:05 #3
bruger du asp.net 2.0 ?
Avatar billede pumpin Nybegynder
10. april 2006 - 08:20 #4
jeps
Avatar billede dr_chaos Nybegynder
10. april 2006 - 08:26 #5
er det en af de indbyggede menuer du bruger ?
Avatar billede pumpin Nybegynder
10. april 2006 - 09:12 #6
Nej da  Dem kan jeg bare ikke hitte ud af at lave dynamiske :D
det er en ganske normal repeater som inden holder et link

<asp:Repeater ID="RepeaterMenu" runat="server">
    <HeaderTemplate><ul></HeaderTemplate>
        <ItemTemplate>
            <li><a href='<%# Eval("tplType") %>?Lid=<%# Eval("id") %>&Uid=0'><%# Eval("text") %></a></li>
        </ItemTemplate>
    <FooterTemplate></ul></FooterTemplate>
  </asp:Repeater>
Avatar billede dr_chaos Nybegynder
10. april 2006 - 09:24 #7
prøv at kigge her:
http://msdn.microsoft.com/msdnmag/issues/05/06/WickedCode/
Den øverste artikel handler om en sql sitemap provider.
Det er præcis det du skal bruge.
Avatar billede pumpin Nybegynder
10. april 2006 - 09:54 #8
wow det virker pænt vildt. lige inden jeg kaster mig ud idet.. er du sikker på det vil øge min preformance på siden jeg mener den vil jo stadig hive det udtræk ud hver gang siden loader og enddag også skrive en XML fil vil det ikke tage længer tid ?
Avatar billede dr_chaos Nybegynder
10. april 2006 - 09:59 #9
på  <siteMap defaultProvider="SqlSiteMapProvider" enabled="true">
kan du enablecaching osv.
Det giver en del perfomance vil jeg mene.
En anden løsning vil være at lave en web.sitemap fil og selv indsætte menupunkter.
Det er den hurtigste løsning.
Avatar billede pumpin Nybegynder
10. april 2006 - 10:04 #10
det skal desvære bare være dynamisk.. både med toplinks og underlinks kan man skrive til web.sitemap filen på en nem måde ?
Avatar billede dr_chaos Nybegynder
10. april 2006 - 10:07 #11
ja det kan man godt.
Men så skal du bare bruge tid på det.
Den bedste måde vil være en masterpage med den løsning jeg har foreslået.
Den fungerer meget hurtigt.
Avatar billede pumpin Nybegynder
10. april 2006 - 10:15 #12
jeg bruger allrede en masterpage som har en usercontrol registret hvor min menu er i.. men når jeg debugger min side så kan jeg se at den laver det samme udtræk til min menu hvergang jeg trykker på et link.. selv om jeg tester at hvis siden er resultatet af et postback så skal den ikke lave det udtræk... men da jeg bruger almindelige links ( <a href=""> ) så er min side aldrig resultatet af et postback...
Avatar billede dr_chaos Nybegynder
10. april 2006 - 10:20 #13
Hvis du bruger den indbyggede menu uden usercontrol vel og mærke.
Kan du få vist hvilken en side du befinder dig på og alt muligt andet.
Du kan bruge et treeview eller asp:menu til at præsenterer din menu.
Hvis du enabler caching  på <siteMap defaultProvider="SqlSiteMapProvider" enabled="true">.
Så laver den ikke et nyt kald til databasen.
Du kan også bestemme hvor lang tid denne caching skal vare.
Avatar billede pumpin Nybegynder
10. april 2006 - 10:20 #14
jeg kan tilføje at jeg har prøvede at lave det sådana t jeg brugte linkbuttons så jeg kunne få min side til at postbacke lidt mere, men uden held fordi når jeg prøver at stoppe en linkbutton ind i en repeater. Så istedet for at den Evaluere det der står i PostBackUrl på min linkB så udsrkiver den det bare som var det en string... ville dette evt kunne hjælpe ?

Det er min repeater med en linkbutton som ikke virker :D

<asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl='<%# Eval("tplType") %>?Lid=<%# Eval("id") %>&Uid=0' ><%# Eval("text") %></asp:LinkButton>
        </ItemTemplate>
  </asp:Repeater>
Avatar billede dr_chaos Nybegynder
10. april 2006 - 10:27 #15
asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl='<%#Eval("tplType") +"?Lid="+ Eval("id") +"&Uid=0"%>' Text='<%# Eval("text") %>'></asp:LinkButton>
        </ItemTemplate>
  </asp:Repeater>
Avatar billede pumpin Nybegynder
10. april 2006 - 10:38 #16
niffi :) men det hjælper mig bare minus.. nogen gange hader jeg asp.net og ville ønske at kunden sku ha PHP :D Jeg kaster mig ud i at lave den der SqlSitemape Provider om til Mysql

Lige en sidste ting inden jeg hopper over til arbejds bordet synes du personligt www.href.dk køre utrolig langsomt ?
Avatar billede dr_chaos Nybegynder
10. april 2006 - 10:44 #17
Du skal bare vende dig til den måde man bruger asp.net på.

Ja den kører lidt langsomt.
Har mistanke om at det specielt er din banner der trækker tænder ud.
Den fylder en hel del.
Avatar billede dr_chaos Nybegynder
10. april 2006 - 10:45 #18
Det er umiddelbart kun et problem ved første kald.
Avatar billede pumpin Nybegynder
10. april 2006 - 11:02 #19
oki mit sidste forsøg på at forb edre preformance inden jeg prøver den helt store Sqlsitemap provider af.. er der ikke en mulighed for at teste i pageload om min datatable er inisileret og hvis den er det så kører den en anden function som bare databinder mine repeaters til min datatabel som er fyldt med det data sådan at den loader data ind i det første gang og ved andre redirects der henter den bare data'en fra min Dt til mine repeaters

bare post et svar Dr chaos !! fandme glad for at du har gidet at kigge på mit problem :D har været ved at rive håret af mig selv
Avatar billede dr_chaos Nybegynder
10. april 2006 - 11:04 #20
svar :)
du kan prøve noget med

if(dinDataTable.Rows.Count >0)
{
//databind
}
else
{
//hentdataog databind.
}

Du kan også vælge at ligge dit dataset i en session.
Avatar billede dr_chaos Nybegynder
10. april 2006 - 11:05 #21
Eller prøve med en Datareader i stedet for et dataset.
Avatar billede pumpin Nybegynder
10. april 2006 - 11:17 #22
jeg bruger en datareader PT..

og lige et aller aller sidste spg. hvis jeg sætter det her ind i min GetLinks()
if(Dt.Rows.Count == 0)
{
udtræk
}
så køre den det lige meget hvad og jeg tror det er fordi jeg aller øverst bruger datatable dt = new datatable(); så hver gang den kommer forbi det så laver den vel en ny datatable ??
Avatar billede pumpin Nybegynder
10. april 2006 - 11:19 #23
når jeg skriver jeg bruger en datareader PT så mener jeg at jeg har også været den igennem men mente at hvis jeg kunne få dataen ud i et dataset så jeg bare kunne binde til noget der lå disconnected ville det gårt stærker, så var jeg fri for min datareader skulle connecte hver gang jeg trykkede på et link :D
Avatar billede dr_chaos Nybegynder
10. april 2006 - 11:27 #24
du kan bruge:
Session["Menu"] = dindatatable;

DataTable dt = (DataTable)Session["Menu"];

//udskriv menu
Avatar billede pumpin Nybegynder
10. april 2006 - 11:33 #25
så du vil stoppe Session["Menu"] = mindatatabel; ind i bunden af min private void getlinks

også i pageload teste på om session["Menu"] == null og hvis den ikke er det så kører DataTable dt = (datatable) Session["Menu"]; ???

eller her jeg misforståret det
Avatar billede dr_chaos Nybegynder
10. april 2006 - 11:39 #26
ja det er rigtigt.
og afslutte med at udskrive menuen.
Avatar billede pumpin Nybegynder
10. april 2006 - 12:18 #27
jeg tror jeg har fat i det men aligevel så tror jeg at jeg har misforståret dig totalt .. er det sådan her du mener ??

protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["Menu"] == null)
        {
            GetLinks();
        }
        else
        {
            DataTable tempDT = new DataTable();
            tempDT = (DataTable)Session["Menu"];
            RepeaterMenu.DataSource = tempDT;
            RepeaterMenu.DataBind();
        }
       
    }

    private void GetLinks()
    {
       
        DataTable Dt = new DataTable();
        string SQL = "SELECT * FROM links";
        MySqlConnection objConn = new MySqlConnection(ConfigurationManager.AppSettings["ConnString"]);
        MySqlCommand objCmd = new MySqlCommand(SQL, objConn);
        MySqlDataAdapter Da = new MySqlDataAdapter(objCmd);
        if (Dt.Rows.Count == 0)
        {

            objConn.Open();
            Da.Fill(Dt);
            objConn.Close();
            RepeaterMenu.DataSource = Dt;
            RepeaterMenu.DataBind();
            Session["Menu"] = Dt;
        }
    }
Avatar billede dr_chaos Nybegynder
10. april 2006 - 12:48 #28
Mere noget i denne stiL:

protected void Page_Load(object sender, EventArgs e)
    {
       
            GetLinks();
       
    }

    private void GetLinks()
    {
         
        DataTable Dt = new DataTable();
        if(Session["Menu"] == null)
{
    string SQL = "SELECT * FROM links";
        MySqlConnection objConn = new MySqlConnection(ConfigurationManager.AppSettings["ConnString"]);
        MySqlCommand objCmd = new MySqlCommand(SQL, objConn);
        MySqlDataAdapter Da = new MySqlDataAdapter(objCmd);
        if (Dt.Rows.Count == 0)
        {

            objConn.Open();
            Da.Fill(Dt);
            objConn.Close();
Session["Menu"] = Dt;
           
        }
else{
Dt= (DataTable)Session["Menu"];

}

            RepeaterMenu.DataSource = Dt;
            RepeaterMenu.DataBind();
    }
Avatar billede pumpin Nybegynder
10. april 2006 - 14:25 #29
top nice.. dr chaos !!

Mange tak for hjælpen champ..
Avatar billede pumpin Nybegynder
10. april 2006 - 16:16 #30
det endte sku med det her: hvad tror du er bedst ? ?

private void CacheLinks()
    {
       
        DataTable Dt = (DataTable)Cache["Toplinks"];
        if (Dt == null)
        {
            //så jeg kan få retuneret en dataTable fra mit datalayer.
            DataLayer DL = new DataLayer();
            string SQL = "SELECT * FROM links";
            Dt = DL.GetDataTable(SQL);

            //sætter den cachede DT ligemed DT med data.
            Cache["Toplinks"] = Dt;
        }
        //databinder som normalt.
        RepeaterMenu.DataSource = Dt;
        RepeaterMenu.DataBind();

    }

metode i min datalayer class

public DataTable GetDataTable(string SqlString)
    {
        MySqlConnection objConn = new MySqlConnection(ConfigurationManager.AppSettings["ConnString"]);
        MySqlDataAdapter objAdapter = new MySqlDataAdapter(SqlString, objConn);

        DataTable tempDT = new DataTable();
        objAdapter.Fill(tempDT);

        return tempDT;
    }
Avatar billede dr_chaos Nybegynder
11. april 2006 - 08:21 #31
det er nogenlunde det samme.
Det er helt fint som løsning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester