Il y a plusieurs choses dans votre code.
- Activez d'abord
Option Strict
. La fonction est déclarée pour renvoyer une chaîne, mais vous essayez de renvoyerObject
avecReturn result
- Tout qui implémente un
Dispose
La méthode doit être utilisée dans unUsing
bloc. Cela vous permet de déclarer et d'initialiser un objet, de l'utiliser et de le supprimer à la fin. Parameters.Add
vaut mieux queAddWithValue
. Ce dernier oblige le fournisseur de base de données à deviner le type de données en fonction des données.- Selon la charge et si cette méthode est souvent utilisée, vous pouvez charger les données dans un
DataTable
et faites des recherches là-dessus plutôt que d'interroger la base de données encore et encore.
Le problème principal est (probablement) que vous ne disposez pas de la DBCommand
objet. Regardez le constructeur que vous utilisez :
Dim cmdx As New MySqlCommand(cmdTextx, connx)
La DBCommand
object reçoit une référence à la connexion. Même si vous supprimez explicitement la connexion, cmdx
y fait toujours référence, et il n'a pas été disposé. Using
les blocs simplifient la tâche pour s'assurer que les choses sont éliminées :
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
Pour réduire l'indentation, vous pouvez "empiler" les éléments en un seul Using
bloquer :
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
Notez la virgule à la fin de la première ligne.
Je serais surpris si ce n'était pas la cause de votre fuite (bien sûr, tout le code devrait être changé).