Det finns flera saker i din kod.
- Aktivera först
Option Strict
. Funktionen deklareras att returnera en sträng, men du försöker returneraObject
medReturn result
- Allt som implementerar en
Dispose
metod borde användas i enUsing
blockera. Detta låter dig deklarera och initiera ett objekt, använda det och göra dig av med det i slutet. Parameters.Add
är bättre änAddWithValue
. Det senare tvingar DB-leverantören att gissa datatypen baserat på data.- Beroende på belastningen och om metoden används mycket, kan du ladda data till en
DataTable
och gör sökningar på det istället för att fråga DB om och om igen.
Kärnproblemet är (förmodligen) att du inte gör dig av med DBCommand
objekt. Titta på konstruktorn du använder:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
DBCommand
objekt skickas en referens till anslutningen. Även om du uttryckligen gör dig av med anslutningen, cmdx
har fortfarande en referens till den, och den kasserades inte. Using
block gör det enkelt att vara säker på att saker kasseras:
Dim sql = "Select `Cert` From `Courses` WHERE `ID`[email protected]"
Using dbCon As New MySqlConnection(MySQLConnStr)
Using cmd As New MySqlCommand(sql, dbCon)
cmd.Parameters.Add("@Id", MySqlDbType.Int32).Value = CourseTypeID
dbCon.Open()
Dim result = cmd.ExecuteScalar
If result Is Nothing OrElse result Is DBNull.Value Then
Return String.Empty
Else
Return result.ToString()
End If
End Using ' close, dispose of conn
End Using ' dispose of DBCommand
För att minska indrag kan du "stapla" objekt i en Using
blockera:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
Notera kommatecken i slutet av den första raden.
Jag skulle bli förvånad om detta inte var orsaken till din läcka (naturligtvis skulle all kod behöva ändras).