DataAdapterインスタンスを常に破棄する必要があることはわかっています。ほとんどの場合、私は接続を閉じた直後に処理を中止しますが、ユーザーがDataTable項目(ListBoxまたはDataGridViewに表示されている)を変更するような場合には、DataAdapterを作成してDataTableを埋めるために使用しますが、ユーザーがSave
をクリックしてDataAdapter.Update(DataTable)
... を呼び出すまでは私の主な質問ではありませんが、これは正しいアプローチですか?"End Using"に達する前にDataAdapterが破棄される
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
彼らは、私は選択肢がデータアダプターを渡したりしないように持っているので、DataTableを設定しLoadDT
を呼び出すために使用している:
戻るメインの質問に、私はこれらの2つの機能を持ちます。最初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」を含むようにタイトルを変更する必要があります。 –