Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
DataTableから新たなDataTableを生成し表示
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30415#CommentId83592
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2019/8/9 14:37:42
Access VBA においても、Recordset オブジェクトの内容に対して
「SELECT * FROM {Recordset1}」のような再問い合わせはできませんでしたよね。
(Recordset 二対して、Filter や Seek や Find などといったカーソル制御に関する機構があるだけ)
最初の例に挙がった DAO の CreateQueryDef や ADOX の Views.Append といったものは、結局のところ、 JET や ACE にとっての CREATE VIEW クエリに相当するものに過ぎません。
(DAO の CreateQueryDef は無名クエリの生成にも使えますが、今回の話とは無関係)
VB.NET でも、CREATE VIEW や CREATE TABLE の SQL を実行することはできますので、
ワークテーブルや VIEW を用いて、そこから再問い合わせを行うことはできるでしょう。
ですがそれはあくまでも Access 側が持つ、ACE / JET の機能に過ぎません。
VB.NET における ADO.NET や DataSet 、VBA における ADODB や DAO とは別物です。
なので Access 側の SQL で処理させるなら、ワークテーブルや VIEW を用いる必要がある、というのが回答になります。
SQL は使わず、VB 側で処理するなら、DataSet のリレーション機能を使ったり、
DataView のフィルターやソート機能を使ったり、LINQ による集計や再加工を行ったりします。
この 2 つはそれぞれ独立したものです。Access にとっての DAO や ADODB がそうであったように。
そもそも DataAdapter や DataSet というのは、Access でいえば、切断型の ADODB.Recordset にあたります。切断型というのは、ActiveConnection が Nothing だが Close されていない、オフライン向けの Recordset のことです。
ADODB において、Recordset の結果を使って別の処理をするとなると、Shape Provider によるリシェイプを利用する必要がありました。(この機能は DAO の Recordset にはありません)
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/reshape-name-property-dynamic-ado
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=36&no=1
これに相当することで良ければ、DataSet 単体で行えます。
リシェイプ時と同様、JET 側の SQL は使えませんけれどね。
また、DataSet には、複数のテーブルを格納できますが、これはデータベースに繋がなくても利用できます。
ループ処理や LINQ で DataTable の各行を取り出して、新たな DataTable を DataSet に追加したり、
複数のテーブル間でリレーションシップを貼ったり、前回の回答のように「式列」を設けたり、
Compute 句による集計を行うことも出来ます。