Avatar billede hlt Juniormester
14. december 2009 - 17:20 Der er 21 kommentarer og
1 løsning

Gemme SqlDataReader i session

Jeg er ved at lave en indkøbskurv og gemmer i den forbindelse mine varer i en session. Men jeg tænkte på om man kunne gemme en sqldatareader i en session som en form for database. Så man på samme måde som en database, kan oprette, redigere antal osv i dette resultset som så igen gemmes i en session.
er der nogen der har prøvet noget tilsvarende?
Avatar billede arne_v Ekspert
14. december 2009 - 17:35 #1
Et DataSet var nok mere anvendelig som "container" end en DataReader.

Principielt kunne noget saadant godt gemmes i databasen. Men det er ikke nogen god loesning. Man henter en database connection fra poolen, bruger den og giver den tilbage til poolen igen (alt det med pool sker automatisk med .NET SqlConnection ved Open og Close). Det er langt bedre for database performance end at have hver bruger holde en permanent aaben connection.
Avatar billede pej-delphi Nybegynder
14. december 2009 - 17:43 #2
Måske det var muligt at tilføje en record i databasen og så blot gemme nøgleværdien i en session variabel. Det vil så i stedet blive nødvendigt at lave noget automatisk oprydning på basen, hvis nu kunderne alligevel springer fra indkøbskurven lige før betalingen.
Avatar billede hlt Juniormester
14. december 2009 - 17:50 #3
det er noget jeg har overvejet. At gemme indkøbskurven i databasen og rydde op når bugeren enten er færdig eller springer fra købet. man kan vel gemme et session id som binder brugeren med data.
Jeg synes bare at hvis man kunne gemme et dataset i en session kunne man slippe for oprydning efter køb og man havde ikke brug for at skulle skille de forskellige brugeres indkøbskurve.
Avatar billede arne_v Ekspert
14. december 2009 - 18:06 #4
Du kan sagtens gemme data i session - bare det ikke holder paa en database connection

List<OrderLine> er glimrende til den slags.
Avatar billede hlt Juniormester
14. december 2009 - 18:26 #5
Er det den "rigtige" måde at lave den slags på?
Avatar billede arne_v Ekspert
14. december 2009 - 18:31 #6
Efter min mening: ja.
Avatar billede hlt Juniormester
14. december 2009 - 20:27 #7
Ok. Jeg fandt noget kode til at oprette og tilføje elementer til en datatable. Jeg ved ikke om det er helt det samme som en "List".
Men har du eventuelt et eksempel eller ved du hvor jeg kan læse om det. Som sagt, så er det VB jeg koder i, selvom jeg lidt overvejer at kaste mig over c#. Jeg synes at der er langt flere eksempler i c#. men det er jo en anden sag.
Avatar billede arne_v Ekspert
14. december 2009 - 20:34 #8
DataTable er typisk en del af DataSet. Det kan ogsaa bruges i en snaever vending omend jeg synes at det er paenere med en egen klasse (OrderLine).

Nu kan jeg iokke huske om DataSet/DataTable har en ref til den DataAdapter og Connection der har loadet dem. Hvis ikke saa er den del jo ogsaa OK.
Avatar billede arne_v Ekspert
14. december 2009 - 20:35 #9
Min erfaring er at C# : VB.NET brugs ratioen generelt er ca. 2 : 1 men at for de advancerede ting er ratioen oppe paa 5-10 : 1.
Avatar billede hlt Juniormester
14. december 2009 - 20:39 #10
men har du et eksempel i brug af f.eks orderline. Er det en klasse man selv laver eller er det en del af .net?
Avatar billede arne_v Ekspert
15. december 2009 - 03:47 #11
Det er en klasse som du selv laver.
Avatar billede hlt Juniormester
15. december 2009 - 13:41 #12
Jeg har forsøgt med et ex hvor man bruger profiles til at gemme info omkring brugerens indkøbskurv. problemet er bare at hvis en bruger starter med at shoppe som anonym, og på et tidspunkt skal logge ind under betaling, så mister man data omkring hvem der "ejer" indkøbskurven. Altså er man registreret i profile tabellen med at random brugerid. og det så det der knytter brugeren sammen med indkøbskurven. Men hvis man så logge ind så har man jo et brugerid man fik ved oprettelsen, og så er der jo ingen indkøbskurv med det brugerid. derfor droppede jeg at bruge det. Fik også det indtryk at det ressource mæssigt var hårdere ved serveren.
Ville du kunne hjælpe mig med at sætte noget sammen?
Avatar billede arne_v Ekspert
15. december 2009 - 16:40 #13
Du burde ikke miste noget ved sen login, hvis du bare gemmer i session.
Avatar billede hlt Juniormester
15. december 2009 - 17:39 #14
men i det eks. jeg har prøvet med, bliver alt gemt i den indbyggede profil tabel. det virker sådan set fint nok. Troede det var det du mente med en klasse. der har jeg nemlig en shoppingcart klasse som man fint kan tilføje og fjerne fra. Det var noget jeg havde prøvet til at starte med, men så kunne jeg ikke få det til at virke, at når en bruger har noget i i kurv og går fra at være anonym til at være logget ind, så skulle det anonyme bruger id skiftes ud med den indloggede brugers id. Det kan jeg ikke få til at virke.
Så nu har jeg egentligt 2 halvfærdige udgaver af en indkøbskurv hvor jeg i begge tilfælde er stødt på problemer som jeg ikke lige kan få løst.
Så jeg er nok nødt til at satse på et af dem og så få løst de issues der er.
Avatar billede arne_v Ekspert
16. december 2009 - 03:29 #15
Jeg mener stadig at gemme en List<OrderLine> i Session er en god løsning.
Avatar billede hlt Juniormester
16. december 2009 - 09:49 #16
Ville du hjælpe mig med at sætte noget sammen? Jeg synes ikke jeg kan finde list i VB.
Avatar billede hlt Juniormester
16. december 2009 - 14:15 #17
Nu er jeg vist ved at have noget på plads. Jeg mangler dog en lille feature. Og det er når man får vist sin kurv (gridview), og man f.eks gerne vil have flere af en vare, så retter man et tekstfelt og trykker på "opdater". Så skal datatabellen opdateres med de nye antal.
Hvordan får jeg overført alle rækker fra gridviewet til datatabellen og derefter lavet en opdatering?
Avatar billede arne_v Ekspert
20. december 2009 - 03:02 #18
Simpelt eksempel med List af klasse:

Imports System
Imports System.Collections.Generic

Public Class MyData
    Private m_s As String
    Public Sub New()
        Me.New("")
    End Sub
    Public Sub New(ByVal s As String)
        Me.m_s = s
    End Sub
    Public Overloads Overrides Function ToString() As String
        Return m_s
    End Function
    Public Property S() As String
        Get
            Return m_s
        End Get
        Set
            m_s = value
        End Set
    End Property
End Class

Class TypSafCol2
    Public Shared Sub Main(ByVal args As String())
        Dim mycol As List(Of MyData) = New List(Of MyData)()
        mycol.Add(New MyData("A"))
        mycol.Add(New MyData("BB"))
        mycol.Add(New MyData("CCC"))
        For i As Integer = 0 To mycol.Count - 1
            Console.WriteLine(mycol(i))
        Next
    End Sub
End Class
Avatar billede arne_v Ekspert
20. december 2009 - 03:02 #19
GridView kan sikker sagtens bruges, men jeg har aldrig brugt den.
Avatar billede arne_v Ekspert
10. januar 2010 - 04:35 #20
Kommet videre ?
Avatar billede hlt Juniormester
10. januar 2010 - 10:17 #21
Hej,
Beklager mit sene svar. Som jeg også skrev, har jeg fundet en løsning. Det blev til en datatable i en session. Så fungere det fint
Men hvis du smider et svar skal du få point som tak for din tålmodighed ;-)
Avatar billede arne_v Ekspert
10. januar 2010 - 14:21 #22
svar
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
Kurser inden for grundlæggende programmering

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