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

LEFTJOINを含むSQLで取得したデータセット更新

環境/言語:[VB.NET2003]
分類:[.NET]

はじめまして、こんにちは。
ERIと申します。
開発環境OS=XPProSP2
使用言語=VB.NET2003
です。

LEFTJOINを含むSQLで取得したデータセットの更新方法について教えてください。

MicrosoftAccess2000で作成したローカルのデータベースファイルに、テーブルAとテーブルBがあるとします。
フィールド構成は以下の通りだとします(名称のみ)。
Aの主キーは[端末番号],[伝票番号]の2つです。
Bの主キーは[ID],[端末番号],[伝票番号]の2つです。
AとBの[端末番号],[伝票番号]が、1対多で関連しています。

テーブル[A]
端末番号
伝票番号
日付
金額

テーブル[B]
ID
端末番号
伝票番号
商品C
商品名
単価
数量
2011年度売上F

以下のコードにおいては、フォームfrmTestにおいて、関数FUNCTIONを実行し、Aの[日付]が2011年以降であるBの[2011年度売上F]を、初期値=0から、1に更新したいと思います。

---------------------------------------------------------------------------------------

Imports System.Data.OleDb

Public Class frmTest
Inherits System.Windows.Forms.Form

Public Function FUNCTION

Dim str1 As String
Dim cnL As OleDb.OleDbConnection
Dim daL As OleDb.OleDbDataAdapter
Dim cbL As OleDb.OleDbCommandBuilder
Dim dsL As New Dataset
Dim dtL As DataTable
Dim drL As DataRow()
Dim i As Integer

Try
str1="SELECT [A].[端末番号],[A].[伝票番号],[A].[日付],[B].[2011年度売上F], " & _
"FROM [A] LEFT JOIN [B] ON ([A].[端末番号]=[B].[端末番号]) AND ([A].[伝票番号]=[B].[伝票番号]) " & _
"WHERE [A].[日付] > "#2010/12/31#""

cnL = New OleDb.OleDbConnection(データベース接続文字列)
daL = New OleDb.OleDbDataAdapter(str1,cnL)
daL.Fill(dsL,"A")
dtL = dsL.Tables("A")
drL = dtL.Select()

If drL.Length > 0 Then
cbL = New OleDb.OleDbCommandBuilder(daL)
For i = 0 To drL.Length - 1
drL(i).BeginEdit()
drL(i)("2011年度売上F") = 1
drL(i).EndEdit()
daL.Update(dsL,"A")
Next
End If
Return True
Catch ex As Exception
MessageBox.Show(ex.Message,"エラー",MessageBoxButtons.OK,MessageBoxIcon.Error)
Return False
End Try
End Function

End Class
----------------------------------------------------------------------------------------

上記のコードを実行しますと、daL.Update(dsL,"A")の行において、
「複数のベーステーブルに対する動的SQLの生成はサポートされません」
とエラーが出てしまいます。

str1のSQL文が、LEFTJOINを含まない、1つのテーブルだけからなるものであれば、
このようなエラーは起きないと思うのですが、
このような場合、OleDbCommandBuilderの方法を使用するのは、
適切ではないでしょうか。
もし適切でない場合、どのような更新方法を使えばよいのか、
分かりません。

どなたかお分かりになられる方がいらっしゃいましたら、
誠にお手数と存じますが、
ご指導よろしくお願い致します。
■No28079に返信(ERIさんの記事)

Update A inner join B
on ([A].[端末番号]=[B].[端末番号]) AND ([A].[伝票番号]=[B].[伝票番号])
Set [B].[2011年度売上F] = 1
Where [A].[日付] > #2010/12/31#

を実行すれば結合して更新は出来ると思いますが、

OleDbDataAdapterを使用するなら単一テーブルのみSelectして更新しないと駄目です。Aを日付条件でSelectしてBをその内容で各々Selectし更新するなど。
shuさま

ありがとうございます^^。
UPDATE文の方で、取り組んでみます^^。
とても勉強になりました^^。


■No28080に返信(shuさんの記事)
> ■No28079に返信(ERIさんの記事)
>
> Update A inner join B
> on ([A].[端末番号]=[B].[端末番号]) AND ([A].[伝票番号]=[B].[伝票番号])
> Set [B].[2011年度売上F] = 1
> Where [A].[日付] > #2010/12/31#
>
> を実行すれば結合して更新は出来ると思いますが、
>
> OleDbDataAdapterを使用するなら単一テーブルのみSelectして更新しないと駄目です。Aを日付条件でSelectしてBをその内容で各々Selectし更新するなど。
解決済み!

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