コードにはいくつかのことがあります。
- 最初に
Option Strictをオンにします 。関数は文字列を返すように宣言されていますが、Objectを返そうとしていますReturn result - すべて
Disposeを実装します メソッドはUsing内で使用する必要があります ブロック。これにより、オブジェクトを宣言して初期化し、使用して、最後に破棄することができます。 -
Parameters.AddAddWithValueよりも優れています 。後者は、DBプロバイダーにデータに基づいてデータ型を推測させる。 - 負荷とそのメソッドが頻繁に使用されるかどうかに応じて、データを
DataTableにロードできます。 DBに何度もクエリを実行するのではなく、その上でルックアップを実行します。
中心的な問題は、(おそらく)DBCommandを破棄しないことです。 物体。使用しているコンストラクターを見てください:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
DBCommand オブジェクトには、接続への参照が渡されます。接続を明示的に破棄しても、cmdx まだそれへの参照があり、それ 処分されませんでした。 Using ブロックを使用すると、物を確実に廃棄することが簡単になります:
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
インデントを減らすために、アイテムを1つのUsingに「スタック」することができます ブロック:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
最初の行の終わりにあるコンマに注意してください。
これがリークの原因ではなかったとしたら、私は驚きます(もちろん、すべてのコードを変更する必要があります)。