Det finns flera saker i din kod.
- Aktivera först
Option Strict. Funktionen deklareras att returnera en sträng, men du försöker returneraObjectmedReturn result - Allt som implementerar en
Disposemetod borde användas i enUsingblockera. 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
DataTableoch 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`example@sqldat.com"
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).