W twoim kodzie jest kilka rzeczy.
- Najpierw włącz
Option Strict. Zadeklarowano, że funkcja zwraca ciąg, ale próbujesz zwrócićObjectzReturn result - Wszystko który implementuje
Disposemetoda powinna być użyta wewnątrzUsingblok. Pozwala to zadeklarować i zainicjować obiekt, użyć go i pozbyć się go na końcu. Parameters.Addjest lepsze niżAddWithValue. Później zmusza dostawcę bazy danych do odgadnięcia typu danych na podstawie danych.- W zależności od obciążenia i tego, czy ta metoda jest często używana, możesz załadować dane do
DataTablei wyszukuj to, zamiast odpytywać DB w kółko.
Podstawowym problemem jest (prawdopodobnie), że nie pozbywasz się DBCommand obiekt. Spójrz na konstruktor, którego używasz:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
DBCommand obiekt otrzymuje odwołanie do połączenia. Nawet jeśli jawnie pozbędziesz się połączenia, cmdx nadal ma do niego odniesienie i to nie został usunięty. Using bloki ułatwiają upewnienie się, że rzeczy zostały usunięte:
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
Aby zmniejszyć wcięcia, możesz „ułożyć” elementy w jeden Using blok:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
Zwróć uwagę na przecinek na końcu pierwszego wiersza.
Byłbym zaskoczony, gdyby to nie była przyczyna twojego wycieku (oczywiście cały kod musiałby zostać zmieniony).