DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■35105 / inTopicNo.1)  LoadOptionのパラメータの意味
  
□投稿者/ Wan 付き人(73回)-(2022/07/20(Wed) 08:21:43)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)
    「メソッドの呼び出し Load 時に OverwriteChanges または PreserveChanges オプションを指定すると、受信データが 'プライマリ データ ソースから送信され、DataTable が変更を DataTable追跡し、変更をデータ ソースに反映できることを前提とします。 Upsert オプションを選択した場合、データは、中間層コンポーネントによって提供されるデータなど、セカンダリ データ ソースのいずれかから取得されたものと見なされ、ユーザーによって変更される可能性があります。 この場合、意図は、1 つ以上のデータ ソースからデータを集計し、データをプライマリ データ ソース DataTableに反映することを前提とします。 この LoadOption パラメーターは、主キー比較に使用する行の特定のバージョンを決定するために使用されます。」

    この内容が全く理解できません。
    @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?
    A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?
    B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?
    C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    詳しい方宜しくお願い致します。

引用返信 削除キー/
■35106 / inTopicNo.2)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ Hongliang 大御所(631回)-(2022/07/20(Wed) 10:19:27)
  • アイコンまずそもそも、DataTable.Load(IDataReader, LoadOption)は、
    > Fills a DataTable with values from a data source using the supplied IDataReader. If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.
    > IDataReaderによって提供されるデータソースの値でDataTableを満たします。データテーブルがすでに行を含んでいる場合、データソースからのデータはloadOptionパラメータの値に従って既存の行とマージされます。
    というメソッドであり、loadOptionパラメータは「データソースからのデータ」と「DataTableに既に存在しているデータ」のマージの方法を指定するものです。
    例えばDataTableが空であれば特に意味を持ちません。

    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    複数のデータソースを扱う場合の話ですね。
    大本のデータソースとなるDBからいったんFillして、追加分をまとめたXMLをセカンダリデータソースとしてLoadでマージするとか。

    > A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?

    この記述はスキーマ情報とは関係ないです。
    DataTableがスキーマを持っていない場合の挙動は別の段落に記載があります。
    (そしてDataTableがスキーマを持っていないならそのDataTableは空ということですから、loadOptionは意味を持ちません)

    > B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?

    ここもスキーマとは関係ないです。
    スキーマに関することは別段落に記載があり、その際の挙動は表にまとめられています。
    OverwriteChanges/PreserveChangesでLoadしたデータはプライマリデータソースからのデータとみなし、あとあとデータソースに反映させることができるようにDataTableの変更を追跡する、ということです。
    一方Upsertは、Loadするデータがセカンダリデータソースからのデータであるとみなされます。

    > C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    表を見る限り、OverwriteChangesとPreserveChangesは同じになっていますが?
引用返信 削除キー/
■35107 / inTopicNo.3)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ 魔界の仮面弁士 大御所(1436回)-(2022/07/20(Wed) 16:38:40)
  • アイコン2022/07/20(Wed) 16:46:02 編集(投稿者)

    No35105に返信(Wanさんの記事)
    > マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)

    機械翻訳で文章が崩れているので、人力翻訳されていた頃(VS2008 まで)の
    ドキュメントの方が読み解きやすいかも知れません。下記から入手できます。
    https://www.microsoft.com/ja-jp/download/details.aspx?id=20955

    上記をインストール後、該当ページはこのあたり。
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/37e7d8d2-8981-efdd-e808-c319ccb71685.htm
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/16edeab2-613e-c1f8-a1bf-f39d9a655ad0.htm

    上記から引用:
    |
    | Load メソッドを呼び出すときに OverwriteChanges オプションまたは PreserveChanges オプションを
    | 指定した場合、受信データは DataTable の主データ ソースから受信されており、DataTable によって
    | 変更が追跡され、変更をデータ ソースに反映できることが想定されます。Upsert オプションを
    | 選択した場合、データは中間層コンポーネントから得られるデータなどの 2 次データ ソースの
    | 1 つから受信されていることが想定されます。これはユーザーにより変更されている可能性があります。
    | その場合、DataTable 内の 1 つ以上のデータ ソースのデータを集約した後、そのデータを
    | 主データ ソースに反映する意図があることが想定されます。主キーの比較に使用する
    | 行のバージョンを特定するために、LoadOption パラメータが使用されます。
    |
    ----
    |
    | 一般的に PreserveChanges オプションと OverwriteChanges オプションでは、ユーザーが
    | DataSet およびその変更を主データ ソースと同期する必要がある場合を想定しています。
    | Upsert オプションは、1 つ以上の 2 次データ ソースの変更を集約するときに役立ちます。
    |


    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?
    > Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    DataTable は、単一の主データソース(a single primary data source)により同期・更新されます。
    さらに DataTable には、1 つ以上の 2 次データソース(one or more secondary data sources)の
    増分データ(incremental data)を加えることもできます。


    > C 「主キー比較に使用する行の特定のバージョン」とは、
    > OverwriteChangesは、Originalの主キーデータを、
    > PreserveChangesは、Currentの、
    > Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    既存行に対する DataRow の特定は PrimaryKey 制約によって行われるわけですが、マッチングされた既存行の
    RowState As DataRowState プロパティに対して、LoadOption がどのように作用するのかを示したものですね。


    Load 時に OverwriteChanges が指定された場合、Original と Current の両方に書き込まれます。
    そして新データにマッチした既存行は、全て Unchanged 状態に上書きされます。
    Deleted 状態だった既存行も、削除が元に戻されて Unchanged 状態に復帰します。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に PreserveChanges が指定された場合、Original に書き込まれます。
    Added / Modifed な既存行は、いずれも Modifed 状態になります。
    Unchanged/Deleted な既存行の RowState はそのまま維持されます。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に Upsert が指定された場合、Current に対して書き込まれます。
    Added/Modifed な行の RowState はそのまま維持されます。
    Unchanged だった行は、新しい値に応じて Unchanged または Modified のいずれかになります。
    既存行とマッチしない新規行は、 Added 状態で取り込まれます。
引用返信 削除キー/
■35117 / inTopicNo.4)  Re[2]: LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(74回)-(2022/07/27(Wed) 18:33:48)
  • アイコンHongliang様、魔界の仮面弁士様
    いつも御指南ありがとうございます。
    お返事したつもりが、遅れていなかったようで、結果的に、お礼が遅くなりすみません。
    両者に御指南頂いた内容を熟読して自己研鑽に励みたいと思います。
    現在格闘中です。

    有難うございました

解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -