• 締切済み

複数テーブルにある個別フィールドを一度で更新

VB.NET2005で開発しております。 複数テーブルにある個別フィールドを一度で更新したいと考えておりますが、JOIN等使用してみたところ上手く行かず困っております。 一度で複数テーブルを更新する事は可能でしょうか? 更新する  更新する テーブル名 フィールドと値 共通キー table1   coulmn2 = A   coulmn1 table2   coulmn3 = B   coulmn1 table3   coulmn4 = C coulmn1 -------------------------------- connect = Me.DbConnect command = connect.CreateCommand command.CommandText = "UPDATE TABLE1, TABLE2 ・・・" da = factory.CreateDataAdapter() da.SelectCommand = command ds = New DataSet da.Fill(ds) conn.Close()

  • Oracle
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

>一度で複数テーブルを更新する事は可能でしょうか? 可否については、可能な場合もある、という回答になります。 オラクルも、「更新可能なビュー」に対する更新機能を持っていますので、 更新可能なインラインビューが書けるようなケースでは、更新可能となります。 更新可能なビューには、プライマリキーを使った内部結合であること等の条件が ありますので、必ずしも3表の同時更新が出来るとは限りません。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

INSERTならば手がありますが、UPDATEはできないと思います。 それだからトランザクションモードという考え方があるのでしょう。 PL/SQLを使わずにVBからやる場合は、Transactionを維持して3回UPDATEすることをお勧めします。  #それにしてもこのコーディングは新しいですね   通常はExecuteNonQueryだと思いますが

関連するQ&A

  • ADO.NETのデータベースについて

     こんにちは。いつもお世話になっております。  プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています.  ADO.NETでデータベースを作成しているのですが、DataSetを介して、任意のフィールドを変更・更新がうまくいきません。プログラムの内容は、保存されているAccessデータから表を読み込み、その表に対して挿入、変更、削除を行い、最後にupdateをしてAccessのデータを更新するというものです。以下、プログラムの一部を抜粋します。拙い説明で申し訳ありません。原因が分かる方、よろしくご教授ください。 m(_)m private: bool LoadAccessFile(String^ path) { // コネクションを作成 OleDbConnection^ cn = gcnew OleDbConnection(); cn->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=" + path; // すべてのデータを読み込む OleDbDataAdapter^ da = gcnew OleDbDataAdapter("select * from 実績テーブル", cn); OleDbDataAdapter^ da2 = gcnew OleDbDataAdapter("select * from クエリ1", cn); OleDbCommandBuilder^ builder = gcnew OleDbCommandBuilder(da); //test OleDbCommand^ selectCommand = cn->CreateCommand(); OleDbCommand^ selectCommand2 = cn->CreateCommand(); OleDbCommand^ insertCommand = cn->CreateCommand(); OleDbCommand^ updateCommand = cn->CreateCommand(); OleDbCommand^ deleteCommand = cn->CreateCommand(); selectCommand->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号 from 実績テーブル where 通し番号=2"; selectCommand2->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー名称, 銀行口座口座名称 from クエリ1"; insertCommand->CommandText = "insert into 実績テーブル (通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号) values (@通し番号, @日付, @内容, @金額, @カテゴリー番号, @銀行口座通し番号)";      (中略) // OleDbDataAdapterのスキーマと、SelectCommandで抽出したデータを格納 da->FillSchema(ds, System::Data::SchemaType::Mapped); da->Fill(ds->Tables["Table"]); // "Table"表の2行3列目のデータを変更 ds->Tables->Add("クエリ1"); //test(090223) DataRow^ row = ds->Tables["Table"]->Rows[1]; //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」 DataColumn^ column = ds->Tables["Table"]->Columns[2]; row[column] = "本"; // "Table"表の0行目を削除 ds->Tables["Table"]->Rows[0]->Delete(); //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」

  • 複数のテーブルをJOINして更新する方法

    複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。

  • DataSet ds = new DataSet();

    DataSet ds = new DataSet(); System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(); da.SelectCommand = cmd; da.Fill(ds); でデータを格納したときに、 重複データを省きたいのですが可能でしょうか? DataReader ならひとつひとつ格納していくので、 重複データを省くことができるのですが。

  • 複数レコードの複数フィールドを一括UPDATE出来ますか?

    顧客テーブルを更新テーブルのデータで更新したい。 No.顧客テーブル = No.更新テーブル です。 更新フィールドは、年齢、県 です。 ●更新テーブル No 年齢  県 --- ----- ------- 1  30  埼玉 2  30  埼玉 3  30  埼玉 ●顧客テーブル(現) No 年齢  県 --- ----- ------- 1  20  千葉 2  20  千葉 3  20  千葉 4  20  神奈川 5  20  福岡 ●顧客テーブル(更新後) No 年齢  県 --- ----- ------- 1  30  埼玉 2  30  埼玉 3  30  埼玉 4  20  神奈川 5  20  福岡 この場合、1つのSQLで、複数レコードの複数フィールドを一括でUPDATEは出来ますでしょうか?

  • VB DB更新時にパラメーターへ値のセット

    データベースの更新についてご指導下さい。 VB2010からSQLサーバーのデータベースに接続しております。 dataAdapter.Updateによりデータベースを更新する際の パラメーターへ値をセットする方法を教えて下さい。 テーブル名Test Code Name ------------ A   Suzuki 希望する処理 テキストボックスに入力された名前に変更 例) Suzuki → Yamada ○フォームの変数として定義 Dim dataAdapter As New SqlDataAdapter Dim dataSet As New DataSet ○FormLoad時にSelectCommandとUpdateCommandを設定 Dim SQL As String = "" Dim command As SqlCommand Dim connection As SqlConnection = New SqlConnection(~) SQL = "SELECT * FROM Test WHERE Code = @code " command = New SqlCommand(SQL, connection) dataAdapter.SelectCommand = command dataAdapter.SelectCommand.Parameters.Add("@code", SqlDbType.Char) SQL = "UPDATE Test SET Name = @name WHERE Code = @code" command = New SqlCommand(SQL, connection) dataAdapter.UpdateCommand = command dataAdapter.UpdateCommand.Parameters.Add("@code", SqlDbType.Char) dataAdapter.UpdateCommand.Parameters.Add("@name", SqlDbType.Text, 50) ○データ表示時にはこれで表示されました。 dataAdapter.SelectCommand.Parameters.Item("@code").Value = ComboBoxCode.text dataAdapter.Fill(dataSet) ○このSelectCommandを参考にこのように書いて見たのですが更新されません。 dataAdapter.UpdateCommand.Parameters.Item("@code").Value = ComboBoxCode.Text dataAdapter.UpdateCommand.Parameters.Item("@name").Value = TextBoxName.Text dataAdapter.Update(dataSet) どのようにしたら実行時にパラメーター化したところへデータをセットできるのでしょうか? データセットに値が入っていないのでは?と予想したのですが…。

  • SQL serverデータ取得

    public static DataSet GetCustomers() { string sql = @"SELECT * FROM M_CHARGE"; SqlConnection conn = new SqlConnection(DBConfiguration.DbConnectionString); SqlDataAdapter da = new SqlDataAdapter(sql, DBConfiguration.DbConnectionString); da.SelectCommand = new SqlCommand(sql, conn); DataSet ds = new DataSet(); ds.Tables.Add("M_CHARGE"); da.Fill(ds, "M_CHARGE"); return ds; } da.Fill(ds, "M_CHARGE");の部分でインスタンスエラーになります。どうしてでしょうか? 誰か教えて下さいお願いします(TдT)

  • 複数テーブルへの更新、挿入について

    複数テーブルへの更新、挿入について教えてください。 現在2つのテーブルがあり、それぞれのテーブルに対して更新処理をかけています。 その処理を一回のSQLで更新できないものかと考えています。 以下のような二つのテーブルに対して一度にIntoできるものなのでしょうか。 よろしくお願いします。 --Teble1-- No Name Post ID 1 aaa bbb 1 2 aaa bbb 2 3 aaa bbb 3 --Teble2-- NO ID Memo 1 1 ccc 2 1 ccc 3 1 ccc 2 2 ccc 3 2 ccc

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • 複数のフィールドを比較してデータが更新されているフィールド名を抽出したい!

    素人質問で申し訳ありませんが教えてください。実は或る伝票管理テーブルがあり、そのリスト中の実質的なキーコードである「伝票番号」フィールドには重複可能なインデックスを設定してあります。それとは別に主キーを設定してはいますが、それはオートナンバーとしてデータをソートするくらいにしか使っていません。 この伝票管理テーブルは外部のTXTファイルを一括して取り込む受け皿として存在していて、アクセス上で各フィールドにキー入力することはありません。 このように「伝票番号」フィールドには同じ番号のものが複数存在するのですが、同じ番号の中で一番最初のものが新規に登録されたもので、2番目以降にくるものが変更として登録されたものですが、残念ながらどのフィールドが更新されたのか判らないので、その都度一項目ずつマニュアルでチェックしている為にとても時間が掛かっています。 それぞれのデータには「伝票番号」以外に合計10項目くらいのフィールドが存在しています。 アクセスで何とか処理できないものかと思いあぐねている内容としては、同じ「伝票番号」をもつデータを時系列的に2データずつ比較します。(直近データ同士の比較) その上で、 (1)10項目のフィールド全てのデータが両者で全くイコールならば、新しい方の行を削除する。 (2)いずれかのフィールドのデータが更新されていれば、主キー同士の番号と更新されているフィールド名を抽出して、別のテーブルにその結果を放り投げる。 例えば、『800888』という「伝票番号」をもったデータが4個テーブル中に存在していて、それぞれに10、25、40、80という主キーが付番されているとして、 (1) 25は10に対し、フィールドKとNのデータが更新されている。 (2) 40は25と全てのデータが全く同じ。 (3) 80は40(=25)とフィールドDとPのデータが違う。 となった場合、まず伝票管理テーブルから主キー40の行を削除し、その上で下記のようなデータを抽出できればうれしいのですが。 10/25: K N 25/80: D P 雲を掴むような話で申し訳ありませんが、こんなことが可能なのかどうかご教示頂ければ幸甚です。宜しくお願いします。

  • 複数条件でoracleデータ更新

    office2016 Oracle12C excelの A1にTEST C1にSERIAL01 F1にKOTEI1 のデータが入っていて、oracleのテーブルデータをexcelマクロで更新させようとしています。 oracle接続等のコマンドは省略してポイント部分のマクロだけ記載します。 (1) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' " End With 上記(1)を実行すると、oracleのTABLE1のデータはSERIAL01に関して KOMOKU1の列がTESTに更新されます。 (2) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With 上記(2)を実行すると、oracleのTABLE1のデータはKOTEI1に関して KOMOKU1の列がTESTに更新されます。 (3) やりたい内容は、 KOMOKU3がSERIAL01 KOMOKU6がKOTEI1 のAND条件だった場合に、KOMOKU1を更新させたいので、 With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' AND KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With の様なマクロを実行するのですが、対象のKOMOKU1がデータ更新されません。 何が悪いのか修正いただきたく。