Es gibt mehrere Dinge in Ihrem Code.
- Aktivieren Sie zuerst
Option Strict
. Die Funktion ist so deklariert, dass sie einen String zurückgibt, aber Sie versuchen,Object
zurückzugeben mitReturn result
- Alles die ein
Dispose
implementiert -Methode sollte innerhalb einesUsing
verwendet werden Block. Dadurch können Sie ein Objekt deklarieren und initialisieren, verwenden und am Ende entsorgen. Parameters.Add
ist besser alsAddWithValue
. Letzteres zwingt den DB-Provider dazu, den Datentyp anhand der Daten zu erraten.- Abhängig von der Auslastung und davon, ob diese Methode häufig verwendet wird, könnten Sie die Daten in eine
DataTable
laden und suchen Sie danach, anstatt die Datenbank immer wieder abzufragen.
Das Kernproblem ist (wahrscheinlich), dass Sie nicht über den DBCommand
verfügen Objekt. Sehen Sie sich den Konstruktor an, den Sie verwenden:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
Der DBCommand
Objekt wird eine Referenz auf die Verbindung übergeben. Auch wenn Sie explizit auf die Verbindung verzichten, cmdx
hat immer noch einen Verweis darauf, und it wurde nicht entsorgt. Using
-Blöcke machen es einfach, sicherzustellen, dass Dinge entsorgt werden:
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
Um die Einrückung zu reduzieren, können Sie Elemente in einem Using
"stapeln". blockieren:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
Beachten Sie das Komma am Ende der ersten Zeile.
Ich wäre überrascht, wenn dies nicht die Ursache Ihres Leaks wäre (natürlich müsste der gesamte Code geändert werden).