TableAdapter Commandの作成法
2014年11月13日
16:04
はじめに
データセットの変更をデータベースに保存する方法は下記のMSDN Developer Networkにおいて次のように記されている。
「データセット内のデータを変更して検証したら、更新されたデータをデータベースに戻す必要があります。 変更したデータをデータベースに送信するには、TableAdapter またはデータ アダプターの Update メソッドを呼び出します。 アダプターの Update メソッドによって単一のデータ テーブルが更新され、正しいコマンド (INSERT、UPDATE、または DELETE) がテーブル内の各データ行の RowState に基づいて実行されます。
貼り付け元 <http://msdn.microsoft.com/ja-jp/library/xzb1zw3x.aspx>」

すなわち、テーブルの各コレクションのステータスを見ながら、INSERT、UPDATE、または DELETEについて3回のループを回して書き込みを行うということである。私の経験では1レコードが約100項目で14000行のデータについてUpdateメッソッドを用いると20数秒の時間を要した。社内のVPNで接続された10MbpsのLAN環境の中でのことである。ただし、DataGridViewを用いた場合はほぼ瞬間といってよい速さで保存が終了する。データ入力用のパネルを作成したWindowsフォームでは全く違った状況になる。おそらくフォーム上のテキストボックスやコンボボックスにデータバイインドされているので、書き込みの際に何らかのインターフェイス上の処理をしているためではないかと想像される。
業務処理を行う上で20秒を超える待ち時間は、私には耐え難く思われ、どうにかしてスピードアップを図りたいと考えたものである。つまり、新規作成したたった1レコードを保存するのに20数秒も待てないし、DataSetを使う以上、非接続型なのでオンメモリのままデータを作成し続けて、どこかで保存するというのも心配性な人間としては、万一の事故があったらどうするの?と考えてしまうのである。
そこで、1レコード保存の方法を調べてみると、DBDirectメソッドなどとあるので次のようなコードの例が掲載されている。
Insert:
private void InsertButton_Click(object sender, EventArgs e)
{
Int32 newRegionID = 5;
String newRegionDescription = "NorthEastern";
try
{
regionTableAdapter1.Insert(newRegionID, newRegionDescription);
}
catch (Exception ex)
{
MessageBox.Show("Insert Failed");
}
RefreshDataset();
}
private void RefreshDataset()
{
this.regionTableAdapter1.Fill(this.northwindDataSet1.Region);
}
Update:
regionTableAdapter1.Update(newRegionID, "Updated Region Description", 5, "NorthEastern");
Delete:
regionTableAdapter1.Delete(5, "Updated Region Description");
貼り付け元 <http://msdn.microsoft.com/ja-jp/library/ms233767.aspx>
ところが、このようなコード書いても引数がサポートされていない云々と返されて、動作しないのである。
-----------------------以下、参考----------------------------
「はじめに」で紹介したMSDNの記事は、これに続いて、TableAdapterを用いる方法とDataAdapterを用いる方法が記されている。
例:
TableAdapter を使用してデータベースをデータセットで更新するには
w TableAdapter.Update メソッドを、try/catch ブロックで囲みます。 以下の例は、NorthwindDataSet 内の Customers テーブルの内容で更新を試みる方法を示します。
C#
try
{
this.Validate();
this.customersBindingSource.EndEdit();
this.customersTableAdapter.Update(this.northwindDataSet.Customers);
MessageBox.Show("Update successful");
}
catch (System.Exception ex)
{
MessageBox.Show("Update failed");
}
貼り付け元 <http://msdn.microsoft.com/ja-jp/library/xzb1zw3x.aspx>
データ アダプターを使用してデータベースをデータセットで更新するには
DataAdapter.Update メソッドを、try/catch ブロックで囲みます。 以下の例は、DataSet1 内の Table1 の内容で、データ ソースへの更新を試みる方法を示します。
C#
try
{
SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
}
catch (Exception e)
{
// Error during Update, add code to locate error, reconcile
// and try to update again.
}
貼り付け元 <http://msdn.microsoft.com/ja-jp/library/xzb1zw3x.aspx



C#/SQL Fou...