.Netでは、Try/Catch/Finallyブロックでデータベース接続をラップし、必ずFinallyセクションの接続を閉じる必要があります。これにはブロックUsing
と略記されています。これは、クラスのメンバとして接続を維持することは、あなたがやっているように、ほとんどいつも間違った方法で行くことを意味します。 .Netは、クエリごとに新しい接続とコマンドオブジェクトを作成する方が良いように最適化されています。
DataReaderは少し特殊です。ブロックを使用してdatareaderを返すと、DataReaderが終了する前に接続を閉じることができます。 C#では、通常、イテレータで問題を回避します(yield return)。 VB.Netは、この構造のためにサポートしていないので、私はそうのように、代わりにAction(Of IDataRecord)
を使用する場合があります。
Dim id As Integer
If Integer.TryParse(IDTextBox.Text, id) Then
MyOracleQuery(id, _
Function(r)
''#... Do something with each "r" here
End Function _
)
Else
''# Complain to user about invalid ID
End If
注:
は
Public Sub MyOracleQuery(ByVal id As Integer, ByVal ProcessRecord As Action(Of IDataRecord))
Dim sql As String = "SELECT <columns> FROM MyTable WHERE ID= @Id"
Using cn As New OracleConnection("connection string"), _
cmd As New OracleCommand(sql, cn)
cmd.Parameters.Add("@Id", SqlDbTypes.Int).Value = id
cn.Open()
Using (rdr As IDataReader = cmd.ExecuteReader())
While rdr.Read()
ProcessRecord(rdr)
End While
End Using
End Using
End Sub
あなたは今、あなたはそれを呼び出す、このコードに匿名メソッドを渡すことができますこのためには、Visual Studio 2010 /.Net 4にmutli-line匿名メソッドが必要です。古いプラットフォームでは、メソッドを宣言したいと思うでしょう。
接続文字列を投稿できますか? – Tridus