C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DataSet/DataAdapterの仕様について


(過去ログ 135 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■79600 / inTopicNo.1)  DataSet/DataAdapterの仕様について
  
□投稿者/ yumeyume (1回)-(2016/04/19(Tue) 22:06:46)

分類:[.NET 全般] 

DataSet/DataAdapterの仕様についてご教授下さい。


■DataSet/DataAdapterの仕様
DataAdapter には、SELECT、UPDATE、INSERT、DELETEのSQL文が設定できます。
Fillメソッドを実行するとSELECTのSQL文の基づいてDataSetにデータを読み込みます。このときDataSetの各行には「編集なし」のマークがついています。
値を更新するとそのマークが「更新済」、削除すると「削除済」、データを追加すると「追加済」のマークに変わります。
Updateメソッドを実行すると、DataSetの各行のマークに応じて、設定してあるUPDATE、INSERT、DELETEのSQL文を実行します。


■実施したい事【概要】
DataAdapterのFillメソッドで取得したDataSet内のDataTableに対して、
挿入/更新操作をかけていき、全ての処理が終わったら、UPDATEを行う。

その際、DataTableに挿入した順番でDBへの挿入SQLが流れてほしい。


■実施したい事【詳細】

DataTable^ tbl;//←DataAdapterのFillメソッドで取得したDataSet内のDataTableだとします

while(10000行程度ループ){

DataRow^ tg_row = tbl->Rows->Find(ループ毎に変わる値);

if( static_cast<DataRow^>(tg_row)==nullptr){
DataRow^ row = tbl->NewRow();
row["hogehoge"] = ループ毎に変わる値;
tbl->Rows->Add(row);//←★★★★★★初期挿入★★★★★★★
}
else{
row["hogehoge"] = ループ毎に変わる値;
}

}

上記のソースで5000行のレコードが出来たと仮定します。
※つまり"ループ毎に変わる値"の重複が半分あったということ

この状態でUPDATEを行うと、
なぜか、初期挿入した順番通りにinsert文が発行されません。
※DB上で見ると順番がごちゃまぜです

■質問@
なぜ、初期挿入した順番通りにinsert文が発行されないのでしょうか?
tbl->Rows->Findで取得したレコードの値を変更すると順番が変更になってしまうのでしょうか?

■質問A
初期挿入した順番にinsert文が発行されようにするには、
どの様にしたら良いでしょうか?
解決策をご教授下さい。

引用返信 編集キー/
■79601 / inTopicNo.2)  Re[1]: DataSet/DataAdapterの仕様
□投稿者/ daive (108回)-(2016/04/19(Tue) 23:46:50)
2016/04/20(Wed) 00:40:33 編集(投稿者)
多分SQLデータベースについて、思い違いをしているだけです。
SQLデータベースは、集合論で表されるデータを扱っています。
1.集合には、原則データの順番はありません。
2.SELECT * FROM TABLE というクエリでは、
  行方向、列方向のデータの順番は、何ら保証されません。
  1億回同じでも、たまたま、同じように抽出されているだけ。
 ⇒実装上の都合で、そういう結果がでているだけ。
  この話も、DO’s&DONT’s #13にちょろっと出てきます。
3.順番にデータを呼出す場合はどうするのか?
  順番になっているデータが入っているフィールド(カラム)を、
  Order句で指定します。
  DO’s&DONT’s #13: 絶対にやってはいけないこと &#8211; ORDER BY が指定されていないクエリの結果が一定の順番に並んでいると仮定すること
  https://blogs.msdn.microsoft.com/jpsql/2012/02/12/dosdonts-13-order-by-1/
  SQLの論理形式 
  http://d.hatena.ne.jp/mickmack/20070822
’
是非とも読んで欲しいサイト
 ミック:リレーショナル・データベースの世界
 http://www.geocities.jp/mickindex/database/idx_database.html
’
Natural Key だけで行っていて、
連番が無い場合は、
Artificial Key
を追加します。
MS-SQL Server では、連番や、GUIDが簡単に作成できますが、
メジャーなSQL Serverでも、連番の取得に工夫が必要な場合があります。
’
VS20xxの型付データセットでは、
1.主キーは必要、無くても扱えない事は無いが、無いと困る事が多い。
2.MS-SQL Server のフィールドには、ID連番を含めておく。
  よっぽど容量が厳しい場合を除き、ID連番を入れておく。
  主キーに困ったら、ID連番とする。
3.フィールの内容は、原則Null許容にしない。
  必要があって、Nullを扱う場合は、この限りでは無い。
’
DataTable / DataSet 
 ⇒ BindingSource 
    ⇒ BindingNavigator
    ⇒ DataGridView
           他DataSourceを受入れる物

引用返信 編集キー/
■79602 / inTopicNo.3)  Re[2]: DataSet/DataAdapterの仕様
□投稿者/ daive (109回)-(2016/04/20(Wed) 07:25:42)
2016/04/20(Wed) 08:29:08 編集(投稿者)
2016/04/20(Wed) 07:28:37 編集(投稿者)

> DataTable / DataSet
>  ⇒ BindingSource
>     ⇒ BindingNavigator
>     ⇒ DataGridView
> 他DataSourceを受入れる物
この関係が理解出来ていると、
DataGridView のDataSourceになり得る、種類の多さにびっくり。
MetadataCollection 、CultureInfo 、list(of T)、他
.Netframework で取得できる、連番を持っているデータの多くを、
DataGridView が受入れる事ができます。
⇒一部、DataGridView で表示出来ない値があるので、
 エラーの握り潰し処理は必要。

データベースのシステムデータベース:master用他のエクスプローラープログラムを
DataGridView で作ると、(MS-SQL NATIVE/ODBC/OLE-DB用は結構簡単に作成できます。)
各接続方法でのデータの持ち方、テーブル情報の違い、等が
理解出来る様になるかもしれません。
Ex.MS-SQL では、フィールド(カラム)の登録順がシステムデータベースで管理されていたりします。
 (実装上の都合です。)
⇒MS-SQL 2000 のサンプルにあった、DMO Explorer の様な奴
引用返信 編集キー/
■79604 / inTopicNo.4)  Re[1]: DataSet/DataAdapterの仕様について
□投稿者/ WebSurfer (894回)-(2016/04/20(Wed) 13:01:29)
No79600 (yumeyume さん) に返信

> なぜ、初期挿入した順番通りにinsert文が発行されないのでしょうか?

そのようになることが MSDN ライブラリなどの Microsoft の公式文書には書いて
ない(自分が見つけられないだけという可能性は否定できませんが)、即ちそう
いうことは保証されてないということではないかと思います。

DataTable/DataAdapter を利用した DB の更新の仕組みは以下の記事の「非接続型
のデータ更新」のセクションの図1と図2を見ると理解しやすいと思います。

DB 設計者のための明解 ADO.NET 第 1 回
https://msdn.microsoft.com/ja-jp/library/cc482903.aspx

「挿入した順番通りにinsert」どころか、挿入、更新、削除の順序も保障されてい
ないはずです。

逆に質問してすみませんが、何故そういうことをする必要があるか、全体的なシナ
リオを含めたやりたいこと教えていただけませんか? 質問者さんがやりたいこと
を実現するためにはこうすればいいというような代案が出てくるかもしれませんの
で。



#ちなみに、挿入、更新、削除の順序は自力でコーディングすればコントロールで
 きます。興味があれば以下の記事の「挿入、更新、削除の順序」のセクションを
 見てください。

 DataAdapter によるデータ ソースの更新 (ADO.NET)
 https://msdn.microsoft.com/ja-jp/library/33y2221y(v=VS.100).aspx

#Visual Studio には、型指定された DataSet + TableAdapter をウィザードベース
 で自動生成する機能があります。さらに、Visual Studio 2008 以降では、階層更
 新を実現する TableAdapterManager クラスが追加で自動生成されるようになりま
 した。TableAdapterManager を使えば、Insert => Update => Delete の順(デフ
 ォルト)または Update => Insert => Delete の順で更新が可能です。

 TableAdapterManager
 http://surferonwww.info/BlogEngine/post/2011/12/21/TableAdapterManager.aspx
引用返信 編集キー/
■79605 / inTopicNo.5)  Re[2]: DataSet/DataAdapterの仕様について
□投稿者/ PANG2 (117回)-(2016/04/20(Wed) 14:19:57)
DataAdapter.Update メソッド
https://msdn.microsoft.com/ja-jp/library/system.data.common.dataadapter.update(v=vs.110).aspx

> アプリケーションが Update メソッドを呼び出すと、DataAdapter は、RowState プロパティを調べ、DataSet に設定されているインデックスの順序に基づいて、要求された INSERT、UPDATE、または DELETE ステートメントを各行に対して反復的に実行します。

とあるので、挿入した順番通りにinsert文が発行されるはずです。

RowUpdatedイベントなどで確認して下さい。
引用返信 編集キー/
■79606 / inTopicNo.6)  Re[1]: DataSet/DataAdapterの仕様について
□投稿者/ shu (858回)-(2016/04/21(Thu) 11:41:34)
No79600 (yumeyume さん) に返信

>
> ■質問@
> なぜ、初期挿入した順番通りにinsert文が発行されないのでしょうか?
> tbl->Rows->Findで取得したレコードの値を変更すると順番が変更になってしまうのでしょうか?

Order By など並び替えを指定しなければ順番は保証されません。


> ■質問A
> 初期挿入した順番にinsert文が発行されようにするには、
> どの様にしたら良いでしょうか?
> 解決策をご教授下さい。
>
順番を保持するための項目を追加して値を自分で設定するようにして下さい。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -