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