【发布时间】:2016-11-10 17:14:33
【问题描述】:
我知道我应该始终处置 DataAdapter 实例。在大多数情况下,我会在关闭连接后立即处理它,但在用户将修改 DataTable 项目(显示在 ListBox 或 DataGridView 中)的情况下,我会创建 DataAdapter,使用它来填充 DataTable,但不要处理它直到用户点击调用DataAdapter.Update(DataTable) 的Save...不是我的主要问题,但这是正确的方法吗?
回到主要问题,我有这两个功能:
Public Function LoadCompaniesDT(ByRef dtCompanies As DataTable) As Boolean
Using daCompanies As MySqlDataAdapter = Nothing
Return LoadCompaniesDT(daCompanies, dtCompanies)
End Using
End Function
Public Function LoadCompaniesDT(ByRef daCompanies As MySqlDataAdapter, ByRef dtCompanies As DataTable) As Boolean
Dim sql As String = "SELECT * FROM companies"
Return LoadDT(daCompanies, dtCompanies, sql, Res.CompaniesFailedMsgBody)
End Function
他们习惯于调用 LoadDT 来填充 DataTable,因此我可以选择是否传递 DataAdapter。
现在我对一些事情感到困惑:当使用第一个 LoadCompaniesDT 函数时,daCompanies 在到达 End Using 之前就被释放了。像这样:
Public Function LoadCompaniesDT(ByRef dtCompanies As DataTable) As Boolean
Using daCompanies As MySqlDataAdapter = Nothing
Dim tmp As Boolean = LoadCompaniesDT(daCompanies, dtCompanies)
Console.WriteLine(daCompanies Is Nothing) ' ==> True!!
Return tmp
End Using
End Function
注意:如果我使用Dim daCompanies 而不是Using daCompanies,那么daCompanies Is Nothing 将返回False。
LoadDT功能码:
Private Function LoadDT(ByRef da As MySqlDataAdapter, ByRef dt As DataTable,
ByVal sqlQuery As String,
ByVal errorText As String) As Boolean
Dim connStr As String = String.Format("server={0}; port={1}; user id={2}; password={3}; database={4}",
DbServer, DbServerPort, DbUserName, DbPassword, DatabaseName)
Dim conn As MySqlConnection = New MySqlConnection(connStr)
Dim cmd As MySqlCommand = New MySqlCommand
Try
conn.Open()
cmd.CommandType = CommandType.Text
cmd.CommandText = sqlQuery
cmd.Connection = conn
da = New MySqlDataAdapter(cmd)
dt = New DataTable
da.Fill(dt)
Return True
Catch ex As Exception
MessageBox.Show(errorText, Res.ServerError, MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
Finally
cmd.Dispose()
cmd = Nothing
conn.Close()
conn.Dispose()
End Try
End Function
【问题讨论】:
-
你应该把标题改成
ByRef,因为这是这个问题的核心
标签: vb.net idisposable dataadapter