0

ADO.NET - 複数の DataTable の更新

上記の質問を見つけましたが、これはまさに私が探していて、解決策を実装しようとしているものです...

複数のテーブルを sqlserver 2008 に更新し、複数のテーブルでのトランザクションを確保するための最善の解決策を見つけようとしています。1 つのテーブルへの挿入が失敗した場合は、他のテーブルの以前の更新をロールバックします。

  1. sqldataadapter は、一度に 1 つのテーブルのみを更新します
  2. 一度に 1 つの dataadapter でトランザクションを実行できることはわかっていますが、複数のテーブルを更新する必要があります

以下は、上記の回答から変更されたコードですが、dataadapter でエラーになります。挿入、更新、および削除コマンドを設定する必要があると思いますが、複数のテーブルがある場合にどのように機能するかわかりませんか??? 誰かが欠けているリンクを埋めることができますか?

        using (SqlConnection con = new SqlConnection(SqlServerConnectionString))
        {
            con.Open();
            //table is an array of datatable and contains data to be inserted
            for (int i = 0; i < table.Length; i++)
            {
                ds.Tables.Add(table[i]);
            }

            SqlTransaction trans = con.BeginTransaction();

            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            //Need to set insert,select, update, delete???? on multiple tables?

            //dataAdapter.Fill(ds);
            dataAdapter.InsertCommand.Transaction = trans; //null object error here
            dataAdapter.UpdateCommand.Transaction = trans;
            dataAdapter.DeleteCommand.Transaction = trans;

            try
            {

                dataAdapter.Update(ds);
                trans.Commit();
            }
            catch(Exception ex)
            {
                trans.Rollback();

            }
4

2 に答える 2

1

皆様のご意見をお寄せいただきありがとうございます。このq / aで@Charlieが以前に回答したと思います:ADO.NET - 複数のDataTableの更新

更新にデータセットを使用できるのではないかと思いましたが、追加のデータ アダプターを作成してから update を呼び出す必要があると思います。したがって、前の質問に対する答えは、@ gamzu07 がやりたかったことを行うための唯一の他の単純な方法は、配列を毎回宣言するのではなく使用することです。以下のコードは機能しますが、私には遅れているように見えます。おそらく挿入コマンドを作成して実行する以外に、もっと良いアイデアがある人はいますか?

            SqlDataAdapter[] dataAdapter = new SqlDataAdapter[table.Length];

            for (int i = 0; i < table.Length; i++)
            {

                dataAdapter[i] = new SqlDataAdapter("select * from " + table[i].TableName, con);
                SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter[i]);
                dataAdapter[i].InsertCommand = cb.GetInsertCommand();
                dataAdapter[i].Fill(table[i]);

            }

            SqlTransaction trans = con.BeginTransaction();

            try
            {
                for(int i=0;i < table.Length;i++){
                    dataAdapter[i].InsertCommand.Transaction = trans;
                    dataAdapter[i].Update(table[i]);
                }
                trans.Commit();
            }
            catch(Exception ex)
            {
                trans.Rollback();
            }
于 2011-11-10T15:01:56.583 に答える
0

それらのそれぞれに対してコマンドを定義する必要があります-ジョブにはSqlCommandBuilderを使用することをお勧めします。

ただし、SqlDataAdapter は1 つのDataTable でのみ機能することに注意してください。それが最初のテーブルであるかどうかは、ドキュメントから明らかではありません。

Update メソッドは、更新を実行する前に、最初のマッピングにリストされたテーブルから行を取得します。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

...または、Table という名前の DataSet 内の唯一のテーブル:

アップデート | "Table" という名前の DataTable から、指定された DataSet で挿入、更新、または削除された行ごとに、それぞれの INSERT、UPDATE、または DELETE ステートメントを呼び出します。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

いずれにせよ、SqlDataAdapter を使用している場合は、テーブルのループで Update を呼び出す必要があります。

編集

いずれにせよ、私が知る限り、ここでは SqlDataAdapter は適切な選択ではありません。DataTable 間でトランザクションを共有するだけの場合は、SqlTransaction を共有する一連の SqlCommand を使用します。

(これが十分に明確でない場合は、仕事に着いたときにコード サンプルを追加します)

于 2011-11-09T22:55:42.823 に答える