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?
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.
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()
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å?
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."