Ich weiß, dass ich DataAdapter-Instanzen immer entsorgen sollte. In den meisten Fällen entsorge ich es sofort nach dem Schließen der Verbindung, aber in Fällen wie wenn Benutzer DataTable Elemente ändern (angezeigt in ListBox oder DataGridView) ich den DataAdapter erstellen, verwenden Sie es, um die DataTable zu füllen, aber nicht disponieren bis der Benutzer klickt Save
die DataAdapter.Update(DataTable)
... ruft nicht meine Hauptfrage, aber ist das der richtige Ansatz?DataAdapter wird vor Erreichen von "End Using" entfernt
Zurück zur Hauptfrage, ich habe diese beiden Funktionen:
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
Sie werden verwendet, LoadDT
zu nennen, die die Datatable füllt so dass ich die Wahl habe einen Dataadapter oder nicht passieren.
Jetzt bin ich etwas verwirrt: Wenn die erste LoadCompaniesDT
Funktion wird daCompanies
angeordnet, bevor End Using
erreicht .. wie folgt aus:
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
Hinweis: Wenn ich Dim daCompanies
statt Using daCompanies
verwenden dann daCompanies Is Nothing
zurückkehren Falsch.
LoadDT
Funktionscode:
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
Sie sollten den Titel ändern, um "ByRef" einzuschließen, weil das der Kern dieses Problems ist –