2011-06-13 6 views
1
私はVB2005とMS AccessのDBを打っていると私はデータがあるので、テーブルが行を持つべきではない。この

VB.NET更新し、複数のテーブルをマージし、MS AccessのDB

Dim sSQL As String = "SELECT * FROM tblCars WHERE WeekOf=#6/1/2011#" 
Dim da As New OleDb.OleDbDataAdapter(sSQL, conn) 
Dim ds As New DataSet 
da.Fill(ds, "CarData") 
Dim cb As New OleDb.OleDbCommandBuilder(da) 

のようなテーブルオブジェクトを作成しています

真新しい。私は、新しいデータでデータのテキストファイルを読み込み、テーブルにこのデータをポンプなどのように新しい行を追加します。

'create a new empty row 
Dim dsNewRow As DataRow = ds.Tables("CarData").NewRow() 

'update the new row with fresh data 
dsNewRow.Item("DriveDate") = dd 
dsNewRow.Item("DCode") = dc 
dsNewRow.Item("CarNum") = carID 
'about 15 more fields 

'add the filled row to the DataSet table 
ds.Tables("CarData").Rows.Add(dsNewRow) 

'end loop 

'update the database with the new rows 
da.Update(ds, "CarData") 

デシベルのテーブルには何の主キーを持っていないが、このすべてが動作し、私はすべての新しいデータを取得しますデータテーブルtblCarsに挿入されます。

これで、データがない車も考慮する必要があります。そのために私の計画は、コントロールテーブルから車のリストを取得し、それをDataテーブルとマージすることでした。

Dim sSQL As String = "SELECT CarId FROM tblControlCars WHERE ActiveCar=True;" 
    Dim daAct As New OleDb.OleDbDataAdapter(sSQL, conn) 
    Dim ds As New DataSet 
    daTail.Fill(ds, "ActCars") 
    Dim cbAct As New OleDb.OleDbCommandBuilder(daAct) 

次に、テーブルのプライマリキーを作成してからマージします。

ds.Tables("CarData").Merge(ds.Tables("ActCars")) 

これがアクティブになっているが、任意のデータを取得していないそれらの車のためのデータともプレースホルダを持っている車のためのすべての新しいデータで私にテーブルを与えるだろう。私は戻って、DBへの更新をしようとするときしかし、私はエラーに

のSystem.InvalidOperationExceptionを得る:UpdateCommandのための動的SQLの生成は、任意のキー列情報を返さないSelectCommandに対してサポートされていません。

なぜマージされたデータをデータベースにプッシュできないのか分かりません。

答えて

0

データベーステーブルにプライマリキーを追加する前に同じ問題が発生しました。コマンドビルダーでは、適切なコマンドを生成するために固有の識別フィールドが必要です。 "id"というフィールドを作成して自動番号を作成するだけで手動で更新する必要はなく、主キーにすることができます

関連する問題