none
親テーブルが同じ列名をもつ場合、子テーブルの列の Expression Property はどう指定したらいいのでしょう? RRS feed

  • 質問

  • こんな関係のテーブルがあります。

     

    一番下の chars_persons テーブルは、左右の chars, persons テーブルを親に
    持ちます。

     

     

    chars_persons テーブルにデザイナで列を追加し (char_name, person_name)、

    その Expression プロパティで親の列を指定しようとしたところ、

     

     

    両親とも同じ列名なので、以下のようなメッセージが出てきてしまいました。

     

     

     

    で、以下を参考に

     

    - DataColumn.Expression プロパティ (System.Data)

     

    Expression プロパティ値をそれぞれ

    • Parent(FK_chars_persons_chars).name
    • Parent(FK_chars_persons_persons).name

    として DataGridView に連結したところ、以下のように取り敢えず期待通りの
    表示と動作をしてますが、間違っていないでしょうか?

     

     

     

     

     

    p.s.
    ----
    - DataColumn.DefaultValue プロパティ (System.Data)

     

    こんなところに...以前質問した時の答えが。

    ということは、デザイナで設定できる。

     

    - DB で設定した既定値を DataSet に引き継がせるには - MSDN フォーラム

     

    2008年3月29日 3:00

回答

  • 間違ってないですよ。

     

    なぜできたことを custar さんは質問されるのだろうと思ったのですが、ヘルプでは child についてのみリレーション名を明示する方法が書かれており、parent については書かれていないからですね?

     

    ヘルプには書かれていないようですが、parent・child は共にリレーション名を明示する書式は有効です。
    今回のように、リレーション名を明示する必要性は child に限った話ではないですから。
    (各々において)1つしかリレーションがない場合には、リレーション名は省略することができますが、現時点では1つでも、将来複数になる可能性を考えると、最初から明示しておく方が無難なのかもしれませんね。

     

     

    それと、ご質問ではない話ですが、今回も構成について書かせていただきます。
    # 参考程度にしてください。責任はとれませんので(^^;

     

    chars_persons についても、前のスレで書きましたように、char_name 等については複写値を持つことになります。これでは取得後に、整合性を保った値の管理を自分で行う必要性が生じてしまいます。

     

    そこで、persons の構造の変更(DB側)を行ってはいかがでしょうか?
    persons から column_id を削除し、その代わりに外部キーとして chars の id を持つようにします。そうすれば前スレでの話と同様に、persons に chars の name を参照する式を持つ項目を追加するだけで、chars_persons に相当するものができると思います。

     

    なお、項目の Expression プロパティでは parent.parent.name のような書式はサポートされていないため、直接参照できる項目は1つ上の親だけのようですね。
    これについては1つ上の親の DataTable にさらに上の親を参照する項目があれば良いです。具体的には、persons にて column_name を参照する項目を追加することが、これにあたります。

     

     

     custar さんからの引用
    こんなところに...以前質問した時の答えが。
    ということは、デザイナで設定できる。

     

    DB 側で設定した既定値には、サーバー側でしか取得できない値もあります(リテラル以外はすべて)。そのために ADO.NET では、既定値が自動的に生成されないようになっているものと思います。

    また、固定値であれば DefaultValue プロパティが使えますが、前のスレのように固定でない場合にはイベントを使う必要があります。

     

    # 前のスレ … 「追加した TableAdapter の作る DataTable を親 DataTable と連携させたい」

    2008年3月30日 7:19

すべての返信

  • 間違ってないですよ。

     

    なぜできたことを custar さんは質問されるのだろうと思ったのですが、ヘルプでは child についてのみリレーション名を明示する方法が書かれており、parent については書かれていないからですね?

     

    ヘルプには書かれていないようですが、parent・child は共にリレーション名を明示する書式は有効です。
    今回のように、リレーション名を明示する必要性は child に限った話ではないですから。
    (各々において)1つしかリレーションがない場合には、リレーション名は省略することができますが、現時点では1つでも、将来複数になる可能性を考えると、最初から明示しておく方が無難なのかもしれませんね。

     

     

    それと、ご質問ではない話ですが、今回も構成について書かせていただきます。
    # 参考程度にしてください。責任はとれませんので(^^;

     

    chars_persons についても、前のスレで書きましたように、char_name 等については複写値を持つことになります。これでは取得後に、整合性を保った値の管理を自分で行う必要性が生じてしまいます。

     

    そこで、persons の構造の変更(DB側)を行ってはいかがでしょうか?
    persons から column_id を削除し、その代わりに外部キーとして chars の id を持つようにします。そうすれば前スレでの話と同様に、persons に chars の name を参照する式を持つ項目を追加するだけで、chars_persons に相当するものができると思います。

     

    なお、項目の Expression プロパティでは parent.parent.name のような書式はサポートされていないため、直接参照できる項目は1つ上の親だけのようですね。
    これについては1つ上の親の DataTable にさらに上の親を参照する項目があれば良いです。具体的には、persons にて column_name を参照する項目を追加することが、これにあたります。

     

     

     custar さんからの引用
    こんなところに...以前質問した時の答えが。
    ということは、デザイナで設定できる。

     

    DB 側で設定した既定値には、サーバー側でしか取得できない値もあります(リテラル以外はすべて)。そのために ADO.NET では、既定値が自動的に生成されないようになっているものと思います。

    また、固定値であれば DefaultValue プロパティが使えますが、前のスレのように固定でない場合にはイベントを使う必要があります。

     

    # 前のスレ … 「追加した TableAdapter の作る DataTable を親 DataTable と連携させたい」

    2008年3月30日 7:19
  •  TH01 さんからの引用

    間違ってないですよ。


    良かった、これでいいんですね。

    あっさり書いてますが、Expression って何?とか、何故エラー?とか調べてました。


     TH01 さんからの引用

    なぜできたことを custar さんは質問されるのだろうと思ったのですが、
    ヘルプでは child についてのみリレーション名を明示する方法が書かれており、
    parent については書かれていないからですね?


    その通りです。明文化されていないやり方だったので、確証が無かったのです。
    あれも駄目、これも駄目、といろいろやってたら出来ただけです。


     TH01 さんからの引用

    (各々において)1つしかリレーションがない場合には、リレーション名は省
    略することができますが、現時点では1つでも、将来複数になる可能性を考え
    ると、最初から明示しておく方が無難なのかもしれませんね。


    リレーションのドキュメントを読むことなく作ってました。今読めば、分かる
    かもしれません。


     TH01 さんからの引用

    persons の構造の変更(DB側)を行ってはいかがでしょうか?

    persons から column_id を削除し、
    その代わりに外部キーとして chars の id を持つようにします。
    そうすれば前スレでの話と同様に、
    persons に chars の name を参照する式を持つ項目を追加するだけで、
    chars_persons に相当するものができると思います。


    その通りです。皆さんから指摘を受ける構造になっているのは分かります。目
    的が親のデータ取得というところだったので、改善せずにそのまま使いました。

     

    リレーションのサンプルとして自分にとって凄く簡単で分かりやすいので、使
    い続けてしまっています。


     TH01 さんからの引用

    DB 側で設定した既定値には、
    サーバー側でしか取得できない値もあります(リテラル以外はすべて)。
    そのために ADO.NET では、既定値が自動的に生成されないようになっているものと思います。


    背景が分かって参考になります。


    TH01 さん、アドバイスありがとうございます。

    2008年3月31日 4:54