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,Objectzurückzugeben mitReturn result - Alles die ein
Disposeimplementiert -Methode sollte innerhalb einesUsingverwendet werden Block. Dadurch können Sie ein Objekt deklarieren und initialisieren, verwenden und am Ende entsorgen. Parameters.Addist 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
DataTableladen 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`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
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).