W twoim kodzie jest kilka rzeczy.
- Najpierw włącz
Option Strict
. Zadeklarowano, że funkcja zwraca ciąg, ale próbujesz zwrócićObject
zReturn result
- Wszystko który implementuje
Dispose
metoda powinna być użyta wewnątrzUsing
blok. Pozwala to zadeklarować i zainicjować obiekt, użyć go i pozbyć się go na końcu. Parameters.Add
jest 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
DataTable
i 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`[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
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).