none
3つのDataTableのRelationをはりたい RRS feed

  • 質問

  • 3つのデータテーブルから都合のいい一つのレイアウトのデータテーブルを作ろうとしています。以下がイメージになります。

    ユーザ一覧【ベース】 / 組織一覧 / ロール一覧 という3つのテーブルがあり

    ユーザ一覧には、社員CD・社員名・所属組織CD・所有ロールCDを有しており、こちらだけでは所属名称と所有ロール名を認識できない問題があります。

    (組織一覧は組織CD・組織名だけ、ロール一覧はロールCD・ロール名だけのレイアウト)

    お聞きしたいのは、データテーブル間に自分が設定したリレーションの方法は許されているか否かです。

    というのも、下段にあるプログラム(VB.NET .Net FrameWork4.0 on VS2012)を実行すると、以下エラーメッセージが表れているためです。

    ”親テーブルと子テーブル間で異なる Locale または CaseSensitive 設定を含む DataRelation または Constraint を追加できません。”

    尚、2テーブル間でリレーションを張って(ユーザ一覧の所有ロールCDとロール一覧のロールCD)以下レイアウトのテーブルを生成することには成功しました。⇒組織名は諦め、ユーザ一覧からの社員CD・社員名・所有ロールCD、ロール一覧からのロール名という書式。

    しかし、もう一つ別のリレーションを追加し(ユーザ一覧の所属組織CDと組織一覧の組織CD)、

    ユーザ一覧からの社員CD・社員名・所有ロールCD、ロール一覧からのロール名、【ユーザ一覧からの所属組織CD、組織一覧からの組織名】を達成しようとすると失敗に終わっています。

    具体的には下記リレーション rel2を生成する部分でエラーとなってしまいます。

    ' ##DT_Userはユーザ一覧のDataTable、DT_Roleがロール覧のDataTable、DT_Departmentが組織一覧のDataTable、
    Dim ds As New DataSet
    ds.Tables.Add(DT_User)
    ds.Tables.Add(DT_Role)
    ds.Tables.Add(DT_Department)

    ' リレーションを作成
    Dim col1 As DataColumn = DT_User.Columns("roleID")
    Dim col2 As DataColumn = DT_Role.Columns("id")
    Dim col3 As DataColumn = DT_User.Columns("deptId")
    Dim col4 As DataColumn = DT_Department.Columns("id")

    Dim rel1 As DataRelation = New DataRelation("Relation1", col1, col2, False)
    ds.Relations.Add(rel1)
    Dim rel2 As DataRelation = New DataRelation("Relation2", col3, col4, False)
    ds.Relations.Add(rel2)

    同一データセット内の、3つ以上のテーブル間のリレーションは、ベースとしているテーブルの同一列を活用する必要があるのでしょうか?

    (DT_Userテーブルは既にroleIDで別テーブルとリレーションを張っているのに、DT_Userテーブルの別列deptIdを更に別のテーブルとのリレーションに活用して良いか)

    長文・分かりにくい文章で大変申し訳ありませんが、よろしくお願い致します。

    2017年6月16日 11:50

回答

  • で、

    親テーブルと子テーブル間で異なる Locale または CaseSensitive 設定を含む DataRelation または Constraint を追加できません

    これらが各テーブルでどう設定されているかは確認されましたか?

    • 回答としてマーク saya24 2017年6月17日 2:01
    2017年6月16日 12:01

すべての返信

  • で、

    親テーブルと子テーブル間で異なる Locale または CaseSensitive 設定を含む DataRelation または Constraint を追加できません

    これらが各テーブルでどう設定されているかは確認されましたか?

    • 回答としてマーク saya24 2017年6月17日 2:01
    2017年6月16日 12:01
  • Hongliang さま

    ご支援をありがとうございます。

    >これらが各テーブルでどう設定されているかは確認されましたか?

    メッセージの内容が全く理解ができず、また理解しようとしていなかった自分の未熟さに痛感しました。

    "どう設定されているか" とのヒントを頂けたので、Localeと呼ばれるプロパティがあることに気がつくことができました。

    あとは各テーブルのLocaleを一致させるだけで、万事うまくいきました。

    助かりました。

    2017年6月17日 2:12
  • 解決済みのところに今さらながらのレスですが・・・

    質問者さんの最終目的が「3つのDataTable」を join した一覧を DataGridView などに表示したいということであって、「こういうテーブルを形成したい」はそのための手段で、目的が果たせれば手段は問わないのであれば、「こういうテーブルを形成」はスキップできると思うのですが。

    例えば「3つのDataTable」に AsEnumerable() メソッドを適用して LINQ で join したリストを作り、それを DataGridView などに表示するとか。

    または、もし「3つのDataTable」を SQL Server などのテーブルから作ったものであれば、「3つのDataTable」を作るのもスキップして、join した SELECT クエリから直接「こういうテーブルを形成」するとか。

    外していたらすみません。

    2017年6月17日 3:41
  • SuferOnWwwさん

    今回は3つのXmlファイルから一つのExcelシートを出力する課題に挑戦していました。Excel単体でもできるところ、あえて経験の少ないWindowsフォームアプリで達成しようと挑戦していました。

    データセット・データテーブルの知識を増やす上では非常に良い経験となりました。

    一応ご報告になります。



    2017年6月18日 2:13
  • > 今回は3つのXmlファイルから一つのExcelシートを出力する課題に挑戦していました。

    それなら Linq to Xml という方向も検討してはいかがですか?

    3 つの DataTable を作るのも、それらに relation を張るのもスキップできるかもしれません。

    2017年6月18日 3:54