Я знаю, что всегда должен удалять экземпляры DataAdapter. В большинстве случаев я удаляю его сразу после закрытия соединения, но в случаях, например, когда пользователь будет изменять элементы DataTable (отображаемые в ListBox или DataGridView), я создаю DataAdapter, использую его для заполнения DataTable, но не удаляю его. пока пользователь не нажмет Save
, что вызовет DataAdapter.Update(DataTable)
... не главный вопрос, но правильный ли это подход?
Вернемся к основному вопросу, у меня есть две функции:
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
, потому что это суть этой проблемы. - person Tim Schmelter   schedule 08.07.2016