在.Net中,您需要將數據庫連接包裝在Try/Catch/Finally塊中,並且始終關閉Finally部分中的連接。有一個簡稱爲Using
塊。這意味着保持一個連接作爲一個類的成員(正如你似乎正在做的)幾乎總是錯誤的方式去做。 .Net已經過優化,因此最好爲每個查詢創建一個新的連接和命令對象。
數據讀取器有點特別:如果您將數據讀取器從使用塊中退出,則可以在DataReader完成之前關閉連接。在C#中,我通常用迭代器解決問題(yield return)。由於VB.Net缺少這種結構的支持,我可能會使用一個Action(Of IDataRecord)
代替,就像這樣:
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
現在,您可以通過匿名方法這段代碼時,你怎麼稱呼它:
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
注這需要Visual Studio 2010 /.Net 4用於多線匿名方法。對於較老的平臺,您需要聲明該方法。
你可以發佈你的連接字符串嗎? – Tridus