none
TableAdapterでトランザクション処理をしたいのですが・・・ RRS feed

  • 質問

  • お世話になります。

    http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/8cb99f03-fafd-46c3-a1f6-6485ee0d1444

    のスレッドで、全行削除のよい方法を質問しているところです。

    こちらがうまく行ったとして、TableAdapterにトランザクション処理を追加したいのですが、

    どのように追加すればよいでしょうか・・・

    ご教授のほど、よろしくお願いいたします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private DB1DataSetTableAdapters.テーブル1TableAdapter _adp;
            private DB1DataSet.テーブル1DataTable _tbl;
    
            public Form1()
            {
                InitializeComponent();
             
                this._adp = new DB1DataSetTableAdapters.テーブル1TableAdapter();
                this._tbl = new DB1DataSet.テーブル1DataTable();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
        //【トランザクション開始】
        (BiginTrans??)
    
                //一旦全部消したい。(ここがうまくいかない)
              _tbl.CLEAR()??  (全行削除処理:現在質問中・・・)
    
                //その後、新規に追加(ここはうまくいく)
                DB1DataSet.テーブル1Row row = _tbl.Newテーブル1Row();
                row.a = "AAA";
                row.b = "BBB";
                _tbl.Addテーブル1Row(row);
                //テーブル更新
                _adp.Update(_tbl);
    
        【コミット】
         (CommitTrans??)
    
        【エラー時:ロールバック】
         (RollbackTrans???)
                
            }
        }
    }
    

     

    2011年12月15日 11:55

回答

  • テーブルアダプタに設定してあるConnectionで、Connection.BeginTransaction()をするとTransactionが開始できます。
    BeginTransaction()の戻り値のTransactionでCommit(),Rollback()ができます。
    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク spna 2011年12月16日 0:42
    2011年12月15日 12:49
  • こちらがうまく行ったとして、TableAdapterにトランザクション処理を追加したいのですが、

    TransactionScopeで囲んでしまうと簡単に実装できます。

    10 行でズバリ!! TransactionScope の利用 (C#)
    http://code.msdn.microsoft.com/windowsdesktop/10-TransactionScope-C-47ceaead



    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク spna 2011年12月16日 0:42
    2011年12月16日 0:38
    モデレータ
  • System.InvalidOperationException: ITransactionLocal インターフェイスは、'Microsoft.Jet.OLEDB.4.0' プロバイダではサポートしていません。ローカル トランザクションを現在のプロバイダで使用することはできません。

    mdbを利用されているのでしょうか? ごめんなさい。その場合、TransactionScopeは使えないようです。以下の情報によれば、jet 4.0でITransactionLocal がサポートされているようですが、

    ITransactionLocal および ITransactionJoin 情報: OLE DB プロバイダーのサポート
    http://support.microsoft.com/kb/221071/ja

    ITransactionJoinをサポートしていないのが問題であり、エラーメッセージが誤っているという情報もありました。

    Trouble with Transaction & OLEDB
    http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/f1eea5a0-751b-4694-9cd3-067cd1122e41

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク spna 2011年12月19日 5:47
    2011年12月16日 4:40
    モデレータ

すべての返信

  • テーブルアダプタに設定してあるConnectionで、Connection.BeginTransaction()をするとTransactionが開始できます。
    BeginTransaction()の戻り値のTransactionでCommit(),Rollback()ができます。
    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク spna 2011年12月16日 0:42
    2011年12月15日 12:49
  • こちらがうまく行ったとして、TableAdapterにトランザクション処理を追加したいのですが、

    TransactionScopeで囲んでしまうと簡単に実装できます。

    10 行でズバリ!! TransactionScope の利用 (C#)
    http://code.msdn.microsoft.com/windowsdesktop/10-TransactionScope-C-47ceaead



    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク spna 2011年12月16日 0:42
    2011年12月16日 0:38
    モデレータ
  • gekka様

    ご指導ありがとうございます。

    早速渡来してみたのですが、実行してもデータが追加されませんでした・・・

    トランザクション処理なしで実行すると、正常に全行削除されてから新規追加されているのですが、

    下記のようにトランザクション処理を追加するとデータベース上で何も変化が起きなくなってしまいました・・

    どうか不備な点をご指摘いただければと思います。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private DB1DataSetTableAdapters.テーブル1TableAdapter _adp;
            private DB1DataSet.テーブル1DataTable _tbl;
    
            public Form1()
            {
                InitializeComponent();
             
                this._adp = new DB1DataSetTableAdapters.テーブル1TableAdapter();
                this._tbl = new DB1DataSet.テーブル1DataTable();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _adp.Connection.Open();
                System.Data.OleDb.OleDbTransaction tr = _adp.Connection.BeginTransaction();
    
                try
                {
                    //トランザクション開始
                    tr.Begin();
    
                    //一旦全行削除
                    foreach (DB1DataSet.テーブル1Row r in _tbl.Rows)
                    {
                        r.Delete();
                    }
                    //テーブル更新
                    _adp.Update(_tbl);
    
                    //その後、新規に追加
                    DB1DataSet.テーブル1Row row = _tbl.Newテーブル1Row();
                    row.a = "AAA";
                    row.b = "BBB";
                    _tbl.Addテーブル1Row(row);
                    //テーブル更新
                    _adp.Update(_tbl);
    
                    //コミット
                    tr.Commit();
                }
                catch
                {
                    tr.Rollback();
                }
                finally
                {
                    _adp.Connection.Close();
                }
            }
        }
    }
    
    
    

     

     

     

    2011年12月16日 2:06
  • trapemiya様

    ご指導ありがとうございます。

    早速トライしてみたのですが、実行時に下のようなエラーメッセージが出ました・・・

    不備な点をご指摘いただければと思います。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Transactions;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private DB1DataSetTableAdapters.テーブル1TableAdapter _adp;
            private DB1DataSet.テーブル1DataTable _tbl;
    
            public Form1()
            {
                InitializeComponent();
             
                this._adp = new DB1DataSetTableAdapters.テーブル1TableAdapter();
                this._tbl = new DB1DataSet.テーブル1DataTable();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    using (TransactionScope tx = new TransactionScope())
                    {
                        //一旦全行削除
                        foreach (DB1DataSet.テーブル1Row r in _tbl.Rows)
                        {
                            r.Delete();
                        }
                        //テーブル更新
                        _adp.Update(_tbl);
    
                        //その後、新規に追加
                        DB1DataSet.テーブル1Row row = _tbl.Newテーブル1Row();
                        row.a = "AAA";
                        row.b = "BBB";
                        _tbl.Addテーブル1Row(row);
                        //テーブル更新
                        _adp.Update(_tbl);
    
                        //コミット
                        tx.Complete();
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    }
    
    

     

     

    System.InvalidOperationException: ITransactionLocal インターフェイスは、'Microsoft.Jet.OLEDB.4.0' プロバイダではサポートしていません。ローカル トランザクションを現在のプロバイダで使用することはできません。
       場所 System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       場所 System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       場所 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
       場所 System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
       場所 System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
       場所 WindowsFormsApplication1.DB1DataSetTableAdapters.テーブル1TableAdapter.Update(テーブル1DataTable dataTable) 場所 D:\Panasonic\C#\test1\DB1DataSet.Designer.cs:行 766
       場所 WindowsFormsApplication1.Form1.button1_Clic'test.vshost.exe' (マネージ型): 'C:\windows\assembly\GAC_MSIL\System.Data.resources\2.0.0.0_ja_b77a5c561934e089\System.Data.resources.dll' が読み込まれました
    'System.InvalidOperationException' の初回例外が System.Data.dll で発生しました。
    k(Object sender, EventArgs e) 場所 D:\Panasonic\C#\test1\Form1.cs:行 45

    2011年12月16日 2:25
  • System.InvalidOperationException: ITransactionLocal インターフェイスは、'Microsoft.Jet.OLEDB.4.0' プロバイダではサポートしていません。ローカル トランザクションを現在のプロバイダで使用することはできません。

    mdbを利用されているのでしょうか? ごめんなさい。その場合、TransactionScopeは使えないようです。以下の情報によれば、jet 4.0でITransactionLocal がサポートされているようですが、

    ITransactionLocal および ITransactionJoin 情報: OLE DB プロバイダーのサポート
    http://support.microsoft.com/kb/221071/ja

    ITransactionJoinをサポートしていないのが問題であり、エラーメッセージが誤っているという情報もありました。

    Trouble with Transaction & OLEDB
    http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/f1eea5a0-751b-4694-9cd3-067cd1122e41

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク spna 2011年12月19日 5:47
    2011年12月16日 4:40
    モデレータ
  • trapemiya様

    ご指導ありがとうございました。

    確かにmdbでは対応していないようですので

    こちらは解決とさせていただきたいと思います。

    ありがとうございました。

    2011年12月19日 5:47