次のようなコードで、DataAdapterを使いまわして二つのTabelを更新しようとしています。既存のデータは一旦全て削除して、ListデータをDataTabelに変換(拡張メソッドを作成しています:ToDataTable)してMargeして更新しようとしています。
1回目(Dt説明)は上手くいくのですが、2回目のUpDateの時に、'SourceColumn '説明' の DataColumn '説明' が見つかりません。'と怒られます。
上手く使いまわす方法を教えてください。
宜しくお願い致します。
Dim MyDir As String = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
Dim Dir既存DB As String = MyDir.Substring(0, 1) & ":\DataBaseTestFolder/"
Dim ConStr As String = "Provider = Microsoft.ACE.OLEDB.12.0;" &
"Data Source=" & Dir既存DB &
"株データベース.accdb"
Dim Dt説明 As New DataTable
Dim Dt銘柄 As New DataTable
Dim Sql説明Select As String = "Select * From 説明Dt"
Dim Sql銘柄Select As String = "Select * From 銘柄Dt"
Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(ConStr)
Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(Sql説明Select, conn)
Dim Da As New OleDb.OleDbDataAdapter
Dim ComBuilder As New OleDb.OleDbCommandBuilder(Da)
Da.SelectCommand = cmd
Da.Fill(Dt説明)
Da.InsertCommand = ComBuilder.GetInsertCommand
Da.DeleteCommand = ComBuilder.GetDeleteCommand
For Each LopDtRow As DataRow In Dt説明.Rows
LopDtRow.Delete()
Next
Dt説明.Merge(List説明.ToDataTable)
Da.Update(Dt説明)
conn = New OleDb.OleDbConnection(ConStr)
cmd = New OleDb.OleDbCommand(Sql銘柄Select, conn)
Da.SelectCommand = cmd
Da.Fill(Dt銘柄)
Da.InsertCommand = ComBuilder.GetInsertCommand
Da.DeleteCommand = ComBuilder.GetDeleteCommand
For Each LopDtRow As DataRow In Dt銘柄.Rows
LopDtRow.Delete()
Next
Dt銘柄.Merge(List銘柄.ToDataTable)
Da.Update(Dt銘柄)
DataAdaper を一回しか使わないケースなら自動開閉任せでも良いのですが、複数回呼び出す場合は DataAdapter の操作前に Open し、処理が終わった後に Close させた方が望ましいです。 たとえば下記の実験例だと、100 回の DataAdapter.Fill で、50 倍の速度差になっています。 http://okwakatta.net/code/ado12.html
今回のケースだとこんなイメージかな。 Using conn As New OleDb.OleDbConnection(ConStr) conn.Open() : Da.Fill(Dt説明) : Da.Update(Dt説明) : Da.Fill(Dt銘柄) : Da.Update(Dt銘柄) : conn.Close() End Using
>> Da Is ComBuilder.DataAdapter >> が、いずれかも True な状態であることは分かるかと思いますが、 > Trueの状態をいう概念を私が理解できていないのはさておき、 Is の両辺が同一のオブジェクト インスタンスであるということです。 「If Da Is ComBuilder.DataAdapter Then」が真である状態。
たとえば、SQL 文を下記のように書き換えた場合、 Da.SelectCommand.CommandText = SQL これによって If ComBuilder.DataAdapter.SelectCommand.CommandText = SQL Then も True になります。DataAdapter が同一なので。