DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数テーブルから作ったデータセットをアップデートしたい

分類:[.NET]

いつもお世話になります。

以下のようにして複数のテーブルから作ったデータセット "D_CURRENT" があります。
(2つのテーブルにあるフィールド "F_NO" は 1:1 の関係になっています)

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

Dim oleDaMain As OleDb.OleDbDataAdapter
Dim dtSetMain As DataSet
Dim dtTableMain As DataTable

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' 接続文字列を作成して接続を開始する
Dim oleCnMain As OleDb.OleDbConnection = New OleDb.OleDbConnection
oleCnMain.ConnectionString = _
"Provider=" & "Microsoft.Jet.OLEDB.4.0" & ";" & _
"Data Source=" & "C:\Documents and Settings\Administrator\My Documents\Test.mdb" & ";" & _
"Persist Security Info=False"

' SQL文を作成してレコードを取得
oleDaMain = New OleDb.OleDbDataAdapter("SELECT T_MAIN.F_NAME, T_SUB.F_INTEGER FROM T_MAIN INNER JOIN T_SUB ON T_MAIN.F_NO = T_SUB.F_NO", oleCnMain)
dtSetMain = New System.Data.DataSet
oleDaMain.Fill(dtSetMain, "D_CURRENT")
DataGrid1.DataSource = dtSetMain

End Sub

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

これをイベント発生時に以下のコードによりアップデートしようとすると、
「複数のベース テーブルに対する動的 SQL の生成はサポートされません。」
というメッセージが表示され、アップデートができないままに終了してしまいます。

Dim oleCbEdit = New OleDb.OleDbCommandBuilder(oleDaMain)
oleDaMain.Update(dtSetMain, "D_CURRENT")

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

複数テーブルからもってきたデータセットの内容をデータベースに更新させる方法はありませんでしょうか?
一度のアップデートしたいデータは1つのテーブル上に置くよりないのでしょうか?

すっかり行き詰まっています...。
どなたかアドバイスをよろしくお願いいたします。
■No1129に返信(Ken-Koさんの記事)
> いつもお世話になります。
>
> 以下のようにして複数のテーブルから作ったデータセット "D_CURRENT" があります。
> (2つのテーブルにあるフィールド "F_NO" は 1:1 の関係になっています)
>
>
> これをイベント発生時に以下のコードによりアップデートしようとすると、
> 「複数のベース テーブルに対する動的 SQL の生成はサポートされません。」
> というメッセージが表示され、アップデートができないままに終了してしまいます。

> 複数テーブルからもってきたデータセットの内容をデータベースに更新させる方法はありませんでしょうか?
> 一度のアップデートしたいデータは1つのテーブル上に置くよりないのでしょうか?
>
> すっかり行き詰まっています...。
> どなたかアドバイスをよろしくお願いいたします。
>
複数テーブルの場合、テーブルのキーの関係で自動アップデートは
困難だと思いますので、自分でSQL文を発行する処理になると思われます。

DataRowオブジェクトのRowStateプロパティで以下の内容が確認できますので
行のステータスに応じSQLを発行します。
・Added :追加なのでInsert文を発行
・Deleted :削除なのでDelete文を発行
・Detached :無視
・Modified :変更なのでUpdate文を発行
・Unchanged :変更なしのため無視
fukuさん、ありがとうございました。とりあえず1歩前進できました。
ところで、よろしければもう少しお願いいたします。

> 複数テーブルの場合、テーブルのキーの関係で自動アップデートは
> 困難だと思いますので、自分でSQL文を発行する処理になると思われます。
>
> DataRowオブジェクトのRowStateプロパティで以下の内容が確認できますので
> 行のステータスに応じSQLを発行します。
> ・Added :追加なのでInsert文を発行
> ・Deleted :削除なのでDelete文を発行
> ・Detached :無視
> ・Modified :変更なのでUpdate文を発行
> ・Unchanged :変更なしのため無視


.Modified に対して Update 文を発行する
.Added に対して Insert Into 文を発行する
ことには成功したのですが、

DataGrid の n 行目をDataGrid 上から削除し、
.Deleted に対して、
Dim dataRow As DataRow
dataRow = dataTableMain.Rows(n)
とし、
oleCmdMain = New OleDb.OleDbCommand("DELETE FROM T_MAIN WHERE F_NO = " & dataRow(0), oleCnMain)
という具合にしようとすると、「削除された行の値を参照できない」という主旨のメッセージがでて、終了してしまいます。
Delete文の発行には、どのような記述をすればよいのでしょうか?

どうかよろしくお願いいたします。
失礼いたします。
> 「削除された行の値を参照できない」という主旨のメッセージがでて、終了してしまいます。
> Delete文の発行には、どのような記述をすればよいのでしょうか?
>
> どうかよろしくお願いいたします。
> 失礼いたします。
>

言葉足らずで済みませんでした。
Deleteされた行を取得する方法です。

以下の2つを参考にしてください。
改行されていますので1行にしてください
1)テーブル内のデータの表示
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconviewingdataindatatable.asp
2)行の状態とバージョン
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconrowstates.asp
  • 題名: Re[4]: .Added と .Deleted
  • 著者: Ken-Ko
  • 日時: 2003/10/26 0:19:46
  • ID: 1134
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
fukuさん、ありがとうございました。 Delete についても無事解決しました。

また、いただいた2つのリンク、他の部分の理解の助けにもなり、大変参考になりました。
(サンプルコードを読んでもよく分からないのはいつものことでしたが...)

おかげさまで、単になんとかなる以上のところまでもってこれました。ありがとうございました。

今後ともどうかよろしくお願いいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板