- PR -

親子関係のテーブル更新処理について(VS2005Bata2)

1
投稿者投稿内容
謎牌
会議室デビュー日: 2005/07/20
投稿数: 1
投稿日時: 2005-08-19 14:58
いつもお世話になっております。初めて投稿いたしますのでお手柔らかに・・・

Visual Studio .NET 2003(以下VS2003とします)で作成したWEBサービスを
Visual Studio .NET 2005Bata2(以下VS2005とします)に移植を行っております。

■WEBサービスのデータベース(親子関係テーブル)更新処理

<VS2003のソースコード>
[WebMethod]
public DataSet UpdData(DataSet ds更新)
{
sqlConnection1.Open();
System.Data.SqlClient.SqlTransaction updTran=sqlConnection1.BeginTransaction();
sqlDeleteCommand1.Transaction = updTran;
sqlInsertCommand1.Transaction = updTran;
sqlUpdateCommand1.Transaction = updTran;
sqlDeleteCommand2.Transaction = updTran;
sqlInsertCommand2.Transaction = updTran;
sqlUpdateCommand2.Transaction = updTran;
try
{
// 更新対象行の全てのエラーをチェックする
// SQL実行で制約違反が発生してもErrorがThrowされなくなる
// 代わりに更新Setの行にRowErrorが記録される  
sa伝票.ContinueUpdateOnError=true; // SQLDataAdapter
sa明細.ContinueUpdateOnError=true;

// 結果Setの準備
// 結果Setはクライアント側の表示Setのマージ(主に追加行のID値の更新)に使用される
ds結果.Clear();
ds結果.Merge(ds更新);
ds結果.AcceptChanges(); // これがないと何故か新規行が複数あるときに不可解なエラーが発生する

// 子テーブル更新のための更新Setを準備
DataSet ds更新2 = ds更新.Copy();
// 親テーブルの更新
sa伝票.Update(ds更新.Tables["伝票"]);

// 子テーブル更新の為の準備
// 新規伝票の場合、親の新しい伝票IDで子の仮IDを変更する
ds更新2.Merge(ds更新.Tables["伝票"]);
DataTable dtM = ds更新2.Tables["明細"];
DataTable dtS = ds更新.Tables["明細"];
foreach(DataRow drM in dtM.Rows)
{
if (drM.RowState == DataRowState.Added)
{
DataRow drS = dtS.Rows.Find(drM["伝票ID"]);
drM.BeginEdit();
drM["伝票ID"] = drS["伝票ID"];
drM.EndEdit();
}
}
ds結果.明細.AcceptChanges();

// 子テーブルの更新
sa明細.Update(ds更新2.Tables["明細"]);
if (ds更新.HasErrors)
{
updTran.Rollback();
return ds更新;
}
else
{
updTran.Commit();
return ds結果;
}
}
finally
{
sqlConnection1.Close();
}
}

private void sa_RowUpdated(object sender,stem.Data.SqlClient.SqlRowUpdatedEventArgs e)
{
DataRow[] rows={e.Row};
ds結果.Merge(rows);
}

<VS2005のソースコード>
※DataSet1に親子関係のテーブル(伝票テーブルと明細テーブル)を設定しています。
[WebMethod]
public DataSet1 UpdData(DataSet1 ds更新)
{
DataSet1 ds結果 = new DataSet1();
DataSet1TableAdapters.伝票TableAdapter ta伝票=new DataSet1TableAdapters.伝票TableAdapter();
DataSet1TableAdapters.明細TableAdapter ta明細=new DataSet1TableAdapters.明細TableAdapter();

ds結果.Clear();
ds結果.Merge(ds更新);
ds結果.AcceptChanges(); // これがないと何故か新規行が複数あるときに不可解なエラーが発生する

try
{
// 子テーブル更新のための更新Setを準備
DataSet1 ds更新2 = (DataSet1)ds更新.Copy();

// 親テーブルの更新
ta伝票.Update(ds更新.伝票);

// 子テーブル更新の為の準備
// 新規伝票の場合、親の新しい伝票IDで子の仮IDを変更する
ds更新2.Merge(ds更新.伝票);
DataTable dtM = ds更新2.明細;
DataTable dtS = ds更新.明細;
foreach (DataRow drM in dtM.Rows)
{
if (drM.RowState == DataRowState.Added)
{
DataRow drS = dtS.Rows.Find(drM["伝票ID"]);
drM.BeginEdit();
drM["伝票ID"] = drS["伝票ID"];
drM.EndEdit();
}
}
ds結果.明細.AcceptChanges();
ta明細.Update(ds更新2.明細);
}
catch (System.Exception)
{
}
if (ds更新.HasErrors)
return ds更新;
else
return ds結果;
}
}

【教えてほしいこと その@】
このVS2005ソースコードにトランザクション処理を追加するにはどうすればよいのでしょうか?
string connStr = ConfigurationSettings.AppSettings["ConnectionString"];
using (SqlConnection connection = new SqlConnection(connStr))
{
connection.Open();
System.Data.SqlClient.SqlTransaction transaction = connection.BeginTransaction();
ta伝票.Connection = connection;
ta伝票.Adapter.UpdateCommand.Transaction = transaction;
^^^^^^^
などとしても上記のAdapter.UpdateCommand.Transaction は読み取り専用でエラーになる。
AdapterメソッドのmodifierはPrivateになってるし・・・クラスビュー→クラスダイアグラムでPublicに変更してもなぜかもとのPrivateに戻ってしまう。うーん

【教えてほしいこと そのA】
SqlDataAdapterにはイベント(RowUpdated)があったのにTableAdapterにはない??
データ更新時のイベントはどこで設定するのでしょうか?

お手数ですが、ご教授のほど宜しくお願いいたします。<m(__)m>
1

スキルアップ/キャリアアップ(JOB@IT)