tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルデータテーブルの主キー設定を複数したい
記事No5728
投稿日: 2007/06/27(Wed) 18:33
投稿者びぎ
 こんばんは。

先日下記のようにデータテーブルの主キー設定を教えて頂きました。


  table1.PrimaryKey = New DataColumn() {table1.Columns("HIN")}
  table1.AcceptChanges()

複数列の主キー設定の書き方は、どのように書くのでしょうか?
すいません、宜しくお願いします。

[ツリー表示へ]
タイトルRe: データテーブルの主キー設定を複数したい
記事No5729
投稿日: 2007/06/27(Wed) 18:38
投稿者魔界の仮面弁士
>   table1.PrimaryKey = New DataColumn() {table1.Columns("HIN")}
これって、見ての通り
  「PrimaryKey プロパティに、DataColumn の配列を渡している」
というコードですよね。
つまり配列ということは、複数の列を渡すこともできる、ということになるかと。

>   table1.AcceptChanges()
これは、主キー設定の件とは関係ないですよ。

[ツリー表示へ]
タイトルRe^2: データテーブルの主キー設定を複数したい
記事No5730
投稿日: 2007/06/27(Wed) 18:58
投稿者びぎ
魔界の仮面弁士さん、ありがとうございます。

table1.PrimaryKey = New DataColumn() {table1.Columns("HIN")}
に複数の列を渡すこともできるということですが
例えばもう1列 KBNという列を追加するには
どのような書き方になるのでしょうか?

[ツリー表示へ]
タイトルRe^3: データテーブルの主キー設定を複数したい
記事No5731
投稿日: 2007/06/27(Wed) 19:07
投稿者びぎ
  魔界の仮面弁士さん、申し訳ありません。

table1.PrimaryKey = New DataColumn() {table1.Columns("HIN"),table1.Columns("KBN")}
で宜しいでしょうか?

もう1つ、つかぬことお聞きしたいのですが
2つのDataTableを合わすのは、よく解りましたが
リレーションにも別テーブルから値の取得ができるとあり

        da1.Fill(ds, "AA")
        da2.Fill(ds, "BB")

        ds.Relations.Add( _
          New DataRelation( _
               "CC", _
                ds.Tables("AA").Columns("SYCD"), _
                ds.Tables("BB").Columns("SYCD") _
               ) _
        )

        DataGridView1.DataSource = ds
        DataGridView1.DataMember = "AA.CC"

のようなコードを書いてみましたが
正しい結果が得られません。

マージでしたいことをリレーションでもできるのですか?

[ツリー表示へ]
タイトルRe^4: データテーブルの主キー設定を複数したい
記事No5735
投稿日: 2007/06/27(Wed) 20:23
投稿者魔界の仮面弁士
> マージでしたいことをリレーションでもできるのですか?

リレーションの仕事は、行単位でのテーブル間の関連付けなので、役割が違うかな…。

「発注伝票」テーブルと「発注明細」テーブルをつなげたり、
「銀行」テーブルと「銀行支店」テーブルをつなげたりとか。


---------
ListBox1、DataGridView1、DataGridView2 を貼っておいてください。
---------

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    Dim table1 As New DataTable("親テーブル")
    table1.Columns.Add("コード", GetType(String))
    table1.Columns.Add("名称", GetType(String))

    Dim table2 As New DataTable("子テーブル")
    table2.Columns.Add("コード", GetType(String))
    table2.Columns.Add("番号", GetType(Short))
    table2.Columns.Add("名称", GetType(String))

    Dim ds As New DataSet()
    ds.Tables.Add(table1)
    ds.Tables.Add(table2)

    table1.Rows.Add("01", "血液型")
    table1.Rows.Add("02", "都道府県")

    table2.Rows.Add("01", 1, "A型")
    table2.Rows.Add("01", 2, "B型")
    table2.Rows.Add("01", 3, "O型")
    table2.Rows.Add("01", 4, "AB型")
    table2.Rows.Add("02", 1, "北海道")
    table2.Rows.Add("02", 2, "東京都")
    table2.Rows.Add("02", 3, "沖縄県")

    ds.Relations.Add("関連", table1.Columns("コード"), table2.Columns("コード"))

    'リレーションを使いながら、データを ListBox1 に列挙する例
    For Each table1Row As DataRow In table1.Rows
        ListBox1.Items.Add(String.Format("({0}){1}", table1Row("コード"), table1Row("名称")))
        For Each table2Row As DataRow In table1Row.GetChildRows("関連")
            ListBox1.Items.Add(String.Format(" ({0}){1}", table2Row("番号"), table2Row("名称")))
        Next
    Next

    'DataGridView1 と DataGridView2 を繋いで、リレーションを表現する例
    ' (1側 を選択すると、関連データが 2側に表示される)
    Dim parentBinder As New BindingSource(ds, "親テーブル")
    Dim childBinder As New BindingSource(parentBinder, "関連")
    DataGridView1.DataSource = parentBinder
    DataGridView2.DataSource = childBinder
End Sub

[ツリー表示へ]
タイトルRe^3: データテーブルの主キー設定を複数したい
記事No5732
投稿日: 2007/06/27(Wed) 19:13
投稿者魔界の仮面弁士
> table1.PrimaryKey = New DataColumn() {table1.Columns("HIN")}
> に複数の列を渡すこともできるということですが
> 例えばもう1列 KBNという列を追加するには
> どのような書き方になるのでしょうか?

「配列」の意味や使い方はわかりますか?

Dim cols(1) As DataColumn
cols(0) = table1.Columns("X")
cols(1) = table1.Columns("Y")
table1.PrimaryKey = cols

のように、一度配列変数に入れてから渡しても良いでしょうし、

With table1
  .PrimaryKey = New DataColumn() {.Columns("V"), .Columns("B")}
End With

のように、直接渡すこともできるかと思いますよ。

[ツリー表示へ]
タイトルRe^4: データテーブルの主キー設定を複数したい
記事No5733
投稿日: 2007/06/27(Wed) 19:21
投稿者びぎ
魔界の仮面弁士さん、何度もありがとうございます。

もうし訳ありません、もう1点だけお聞きしたいのですが、

マージでしたいことをリレーションでもできるのですか?

テーブルAにテーブルBを横に付けるような感じなのですが・・

[ツリー表示へ]
タイトルRe^5: データテーブルの主キー設定を複数したい
記事No5736
投稿日: 2007/06/27(Wed) 20:26
投稿者魔界の仮面弁士
>  マージでしたいことをリレーションでもできるのですか?
DataSet/DateTable クラスの Merge メソッドと、
DataRelation クラスを比較しているのでしょうか?

それぞれの役割は異なるので、代替機能とはならないでしょう。

[ツリー表示へ]
タイトルRe^6: データテーブルの主キー設定を複数したい
記事No5737
投稿日: 2007/06/27(Wed) 21:25
投稿者びぎ
魔界の仮面弁士さん、ありがとうございます。

DataRelation では、どうしも2つのテーブルが横に付かないのですよね。

このことを確認したかったのです。

[ツリー表示へ]
タイトルRe^7: データテーブルの主キー設定を複数したい
記事No5738
投稿日: 2007/06/28(Thu) 11:42
投稿者びぎ
   魔界の仮面弁士さん、何度も何度もありがとうございます。

最後にもう少しお聞きしたいのですが、

2つのDataTableをマージするのに

MyDt3.Merge(MyDt1)
MyDt3.Merge(MyDt2)

というように3番目に2つをマージさせました。
結果はOKです。

では3番目を使わず
MyDt1.Merge(MyDt2, True, MissingSchemaAction.Add)

1番目に2番目をマージさせるような書き方をしみますと
2番目の状態になってしまいます。

3つ目のDataTableを使わないでマージできないのでしょうか?

[ツリー表示へ]
タイトルRe^8: データテーブルの主キー設定を複数したい
記事No5739
投稿日: 2007/06/28(Thu) 13:44
投稿者魔界の仮面弁士
> 2番目の状態になってしまいます。
『2番目の状態になる』とは、具体的にはどのような結果を指しているのでしょうか?

> MyDt1.Merge(MyDt2, True, MissingSchemaAction.Add)
Merge メソッドのそれぞれの引数の意味は、理解されていますか?

[ツリー表示へ]
タイトルRe^9: データテーブルの主キー設定を複数したい
記事No5740
投稿日: 2007/06/28(Thu) 16:55
投稿者びぎ
2番目の状態になってしまいますは
MyDt2の子テーブルの内容です。

MyDt1.Merge(MyDt2, True, MissingSchemaAction.Add)
は MyDt1にMyDt2をマージするということですよね。

MissingSchemaAction.AddでMyDt1にMyDt2をマージする時
不足している列を追加するということですよね。

第3の新しいDataTableにマージしない時は
スキーマのマージ、データのマージと
2段階でおこなうのでしょうか。

[ツリー表示へ]
タイトルRe^10: データテーブルの主キー設定を複数したい
記事No5741
投稿日: 2007/06/28(Thu) 19:08
投稿者魔界の仮面弁士
題名と内容が一致しなくなってきましたね。
長く続くようであれば、スレッドを切って仕切りなおした方がよいかも?

>  2番目の状態になってしまいますは
> MyDt2の子テーブルの内容です。
すみません。そういう曖昧なことではなく、
  MyDt1/MyDt2 それぞれの列定義は、どのようになっていて、
  それぞれに、どのようなデータが入っているときに、
  どのような結果になるのでしょうか?
という意味での質問でした。もっと細かく問いなおせば良かったですね。m(_ _)m


> MyDt1.Merge(MyDt2, True, MissingSchemaAction.Add)
> は MyDt1にMyDt2をマージするということですよね。
>  MissingSchemaAction.AddでMyDt1にMyDt2をマージする時
> 不足している列を追加するということですよね。

間違っているわけではありませんが……何かが抜けていませんか?

ヒント:今回使っている Merge メソッドでは、3 つの引数が指定されていますよね。

[ツリー表示へ]
タイトルRe^11: データテーブルの主キー設定を複数したい
記事No5742
投稿日: 2007/06/28(Thu) 19:18
投稿者びぎ
  確かに題名とそれてきました。

もう少し、マージを検証して改めて投稿します。

今回も魔界の仮面弁士さん、ありがとうございました。

また、宜しくお願いします。

[ツリー表示へ]