Der er flere ting i din kode.
- Tænd først
Option Strict
. Funktionen er erklæret at returnere en streng, men du forsøger at returnereObject
medReturn result
- Alt som implementerer en
Dispose
metode bør bruges i enUsing
blok. Dette giver dig mulighed for at erklære og initialisere et objekt, bruge det og bortskaffe det til sidst. Parameters.Add
er bedre endAddWithValue
. Det senere tvinger DB-udbyderen til at gætte datatypen baseret på dataene.- Afhængigt af belastningen og om metoden bruges meget, kan du indlæse dataene til en
DataTable
og lav opslag på det i stedet for at forespørge i databasen igen og igen.
Kerneproblemet er (sandsynligvis), at du ikke bortskaffer DBCommand
objekt. Se på den konstruktør du bruger:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
DBCommand
objekt sendes en reference til forbindelsen. Selvom du udtrykkeligt disponerer over forbindelsen, cmdx
har stadig en henvisning til det, og det blev ikke bortskaffet. Using
blokke gør det nemt at være sikker på, at tingene er bortskaffet:
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
For at reducere indrykning kan du "stable" elementer i én Using
blokere:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
Bemærk kommaet i slutningen af den første linje.
Jeg ville blive overrasket, hvis dette ikke var årsagen til din lækage (selvfølgelig skulle al koden ændres).