webForumDet fria alternativet

databasproblem

10 svar · 579 visningar · startad av MizzK

MizzKMedlem sedan juni 2003410 inlägg
#1

Har ett mycket irriterande fel, Får felet åtgärden avbröts efter ett visst antal klickningar på sidan (uppstår på olika sidor oftast) och då det måste läsas från databasen. Har försökt gå igenom alla öppningar och stängningar för att kontrollera så att connections till databasen stängs.. och enligt vs debug läger verkar det som om det gör det.

Uppbyggnad:
Sidan är uppbyggd med hjälp av en default.aspx sida samt några UserControls samt en placeholder.
Anväder mig även av en access databas samt OLEDB.

mkt kod här nedan, mkt e dock samma och enkelt går att skumma över =)

Bifogar därför default sidans vb kod.

'Server.ScriptTimeout = 60000
        Dim strConn As String = ConfigurationSettings.AppSettings("Connstr").Replace("%MAPPATH%", Server.MapPath(" "))
        Dim myConn As New OleDbConnection(strConn)

        Dim PageChoice As String = Request.QueryString("page")

        If User.IsInRole("admin") = True Then
            loggain.Visible = False
            loggaut.Visible = True
            orgmeny.Visible = False
            adminmeny.Visible = True
            nollningmeny.Visible = False
            personalmeny.Visible = False
            vipmeny.Visible = False
            guldvipmeny.Visible = False

        ElseIf User.IsInRole("nollning") = True Then
            loggain.Visible = False
            loggaut.Visible = True
            orgmeny.Visible = False
            adminmeny.Visible = False
            nollningmeny.Visible = True
            personalmeny.Visible = False
            vipmeny.Visible = False
            guldvipmeny.Visible = False

        ElseIf User.IsInRole("personal") = True Then
            loggain.Visible = False
            loggaut.Visible = True
            orgmeny.Visible = False
            adminmeny.Visible = False
            nollningmeny.Visible = False
            personalmeny.Visible = True
            vipmeny.Visible = False
            guldvipmeny.Visible = False

        ElseIf User.IsInRole("vip") = True Then
            loggain.Visible = False
            loggaut.Visible = True
            orgmeny.Visible = False
            adminmeny.Visible = False
            nollningmeny.Visible = False
            personalmeny.Visible = False
            vipmeny.Visible = True
            guldvipmeny.Visible = False

        ElseIf User.IsInRole("guldvip") = True Then
            loggain.Visible = False
            loggaut.Visible = True
            orgmeny.Visible = False
            adminmeny.Visible = False
            nollningmeny.Visible = False
            personalmeny.Visible = False
            vipmeny.Visible = False
            guldvipmeny.Visible = True

        Else
            loggain.Visible = True
            loggaut.Visible = False
            orgmeny.Visible = True
            adminmeny.Visible = False
            nollningmeny.Visible = False
            personalmeny.Visible = False
            vipmeny.Visible = False
            guldvipmeny.Visible = False

        End If

        Try
            'Om page="" skickas besökaren till startsidan
            If PageChoice = "" Then
                If User.IsInRole("admin") = True Then
                    Dim myControl1 As Control = LoadControl("adminstart.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                ElseIf User.IsInRole("nollning") = True Then
                    Dim myControl1 As Control = LoadControl("nschema.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                ElseIf User.IsInRole("personal") = True Then
                    Dim myControl1 As Control = LoadControl("persstart.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                ElseIf User.IsInRole("vip") = True Then
                    Dim myControl1 As Control = LoadControl("vipstart.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                ElseIf User.IsInRole("guldvip") = True Then
                    Dim myControl1 As Control = LoadControl("guldvipstart.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                Else
                    Dim myControl1 As Control = LoadControl("start.ascx")
                    placemitt.Controls.Add(myControl1)
                    sida.Text = ""
                End If
            Else
                Dim myControl2 As Control = LoadControl(PageChoice & ".ascx")
                placemitt.Controls.Add(myControl2)

                'sql sats som tar de värdena från databasen
                Dim strSQL As String = "SELECT Meny.menyNamn FROM(meny) WHERE Meny.lank= '" & PageChoice & "';"
                Dim myCommand As New OleDbCommand(strSQL, myConn)
                Dim myDataReader As OleDbDataReader

                myConn.Open()
                myDataReader = myCommand.ExecuteReader()

                Do While (myDataReader.Read()) = True
                    Dim sidan As String = myDataReader("MenyNamn")
                    sida.Text = "<a href='default.aspx?page=" + PageChoice + "' class='aktsida' > " + sidan + "</a>"

                Loop

                myDataReader.Close()
                myDataReader = Nothing
                myConn.Close()
                myConn = Nothing
            End If
        Catch ex As Exception
            'fel
            ' Logga felet och visa ett allmänt felmeddelande för användaren
            'Dim myControl As Control = LoadControl("error.ascx")
            'placemitt.Controls.Add(myControl)
            lblMessage.Text = ex.Message
        End Try

    End Sub
    '**********************************************************
    'När användaren loggar ut skickas det till default.aspx
    '**********************************************************
    Sub Logout_Click(ByVal Src As Object, ByVal E As EventArgs)
        FormsAuthentication.SignOut()
        Response.Clear()
        Response.Redirect("default.aspx")

    End Sub

och sen meny.aspx.vb som laddas som en uc i default

 Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'Server.ScriptTimeout = 60000

        'Skapar anslutning (anropar från web.config)
        Dim strConn As String = ConfigurationSettings.AppSettings("Connstr").Replace("%MAPPATH%", Server.MapPath(" "))
        'Dim myConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Server.MapPath("database/vipdb.mdb"))
        Dim myConn As New OleDbConnection(strConn)
        'sql sats som tar de värdena från databasen
        Dim strSQL As String = "SELECT Meny.*, Meny.layoutNr FROM(meny)WHERE (((Meny.layoutNr)=1));"
        'skapar anslutning
        Dim myCommand As New OleDbCommand(strSQL, myConn)
        Dim myDataReader As OleDbDataReader
        'myConn.ConnectionTimeout() = 30

        Try
            myConn.Open()
            myDataReader = myCommand.ExecuteReader()
            menyReapeter.DataSource = myDataReader
            '<--Bind data to Repeater-->
            menyReapeter.DataBind()
            myDataReader.Close()
            myDataReader = Nothing
            myConn.Close()
            myConn = Nothing
        Catch ex As Exception
            lblMessage.Text = ex.Message
        End Try

    End Sub

Någon som vet vad det beror på och hur jag skall göra för att åtgärda felet.. Förslag?

jmeMedlem sedan maj 20012 237 inlägg
#2

I default sidans kod där du gör ett databas anrop så stänger du kopplingen till databasen i slutet av Else-satsen, men vad händer ifall en exception kastas före myConn.close() kallas?

Då lämnas uppkopplingen mot databasen öppen.

I java så finns det en s k final sats. Vet inte om det finns i ASP.NET.

DU bör nog placera den delen av kod som sköter stängningen av uppkopplingen mot databasen, efter try-catch satsen.

MizzKMedlem sedan juni 2003410 inlägg
#3

efter 2 dygn slitande har jag kommit på hur man skall göra för att åtgärda felet sätt Dispose() efter avslutad connection.
ex:
myConn.Close()
myConn.Dispose()

emissionMedlem sedan dec. 19996 721 inlägg
#4

"Finally" finns i VB.NET

mozillaMedlem sedan juli 20011 084 inlägg
#5

MizzK skrev:

efter 2 dygn slitande har jag kommit på hur man skall göra för att åtgärda felet sätt Dispose() efter avslutad connection.
ex:
myConn.Close()
myConn.Dispose()

Måste/ska man använda Dispose() efter man har stängt databaskopplingen(med Close())? Vad är det man gör då?

desdecadoMedlem sedan juli 2004206 inlägg
#6

Jag trode garbage collectorn tog hand om det mesta i .net?

MizzKMedlem sedan juni 2003410 inlägg
#7

Vad jag har förstått tar de bort all "skit "som ligger kvar i minnet. För att förhindra blockeringar och sånnt.

ur msdn:
"Call Dispose when you are finished using the Control. The Dispose method leaves the Control in an unusable state. After calling this method, you must release all references to the control so the memory it was occupying can be reclaimed by garbage collection.

Note Always call Dispose before you release your last reference to the Control. Otherwise, the resources the Control is using will not be freed until garbage collection calls the Control object's destructor."

jmeMedlem sedan maj 20012 237 inlägg
#8

mizzk: sätt dispose och close i en finally sats

MizzKMedlem sedan juni 2003410 inlägg
#9

har jag redan gjort =)

jmeMedlem sedan maj 20012 237 inlägg
#10

bra! Då är du ett steg åt rätt håll :)

emissionMedlem sedan dec. 19996 721 inlägg
#11

Det borde räcka med att köra Dispose, eftersom den implicit även kör en Close

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
126 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)