14. december 2009 - 17:20Der 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?
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.
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.
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.
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.
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?
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.
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?
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
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 ;-)
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.