webForumDet fria alternativet

UserControl; köra en fast flera...

.NET

5 svar · 449 visningar · startad av Travoni

Medlem sedan okt. 20041 556 inlägg
Frågan#1

För att undvika att göra fler databasanrop än nödvändigt när jag kör mina UC så skulle jag vilja kunna göra så här:
1. Registrarar min uc högst upp på sidan som vanligt.
2. När UC:n körs första gången på sidan så görs ett databasanrop
3. Nästa gång uc:n körs (Flera av samma kontroller på samma sida)
så görs inget databasanrop utan hämtas på något annat sätt...
Hur gör jag nu detta?
Det kanske inte äns skall vara en UC, utan en...

I klassisk ASP hade jag gjort ett databasanrop högst upp på sidan, lagt in databasposterna i en array med getrows och ev. via en funktion/sub på diverse ställen hämtat respektive post.
Ex.

set rs=conn.execute("SELECT ett FROM db WHERE id=1")
If not rs.eof then myRows = rs.getrows()

<%=myRows(0,0)%>
Annat innehåll
<%=myRows(0,1)%>
Mer innehåll <%=myRows(0,2)%>

Tacksam för hjälp.

Medlem sedan juni 20019 024 inlägg
#2

Cacha kontrollen eller databasanropet.

Medlem sedan feb. 2005280 inlägg
#3

Det är nog inte optimalt i .net att göra på det sättet.

Jag skulle föreslå att du i codebehind istället hämtar ut datat och och ger asp:Labels på htmlsidan dessa värden.

Handlar det om massa items som loopas ut så skulle jag nog fyllt en repeater som man sen enkelt i htmlsidan kan hämta data ur med hjälp av <%# DataBinder.Eval(Container.DataItem, "ArtNr") %> se tutorial: http://dotnetjunkies.com/Tutorial/36FB37DF-D808-4F4C-819F-896A63C7589A.dcik

Medlem sedan okt. 20041 556 inlägg
#4

freguz: Det är möjligt att det inte är, men det måste gå att lösa. (Vore löjligt annars... :) )
En repeater funkar tyvärr inte eftersom att kontrollerna hamnar på helt olika ställen.

Pace: Smart, cacha databasanropet funkar ju bra typ så här:

Dim objDSCache As DataSet = CType(Cache.Get("objDSCache"), DataSet)

        If objDSCache Is Nothing Then
            Dim sqlStr As String = "SELECT txt FROM DB WHERE id=1"
            Dim objConnect As New MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("connectionString").ConnectionString)
            Dim objDataAdapter As New MySqlDataAdapter(sqlStr.ToString(), objConnect)
            Dim objDS As New DataSet()
            'Cache.Insert("objDSCache", objDS, [B]cacheDependencyObj[/B], DateTime.Now.AddSeconds(60), TimeSpan.Zero)
            Cache.Insert("objDSCache", objDS)
            objDataAdapter.Fill(objDS, "Info")
            objConnect.Close() : objConnect = Nothing
            GetRows = objDS.Tables("Info")

            objDataAdapter = Nothing : objDS = Nothing
        Else
            GetRows = objDSCache.Tables("Info")
        End If

Men då återstår ett problem... Cachen ligger kvar oavsätt sida.
Hur undviker man det?
Kan jag döpa cachens namn olika eller går det att utnyttja cacheDependencyObj
Typ så här:

Cache.Insert("objDSCache" & [B]page_id[/B], objDS, Nothing, DateTime.Now.AddSeconds(60), TimeSpan.Zero)
Medlem sedan dec. 19996 721 inlägg
#5

Om du vill knyta cachen till en specifik sida (adress), så kan du göra som du skriver ovan (ändra cache-nyckel). Om det ska cachas för en specifik request så använd Context.Items.

Medlem sedan okt. 20041 556 inlägg
#6

Härligt :)

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)