fc2ブログ

記事一覧

データセットに複数列のリレーションを追加する方法 | VB.NET


今回は VB.NET でデータセットに複数列の主キーを持つリレーションの作成方法について覚え書きします。
数年前に GrapeCity SPREAD を用いた開発等で多階層構成マスタ(BOM)を表現することも行っていましたが、再度使用してみると意外と忘れいてる箇所がありましたので、今回は覚え書きとして残したいと思いました。


前提条件
Windows 7 professional 以降 / Windows Server 2008 R2 以降
Visual Studio 2010 professional 以降
VB.net
.Net FrameWork 4.0 以降



1.データベースの構造

サンプルデータに用いるデータベースのテーブル構造について説明させていただきます。

vb_dataset_multilayer_01.png


T_Category_L
CREATE TABLE [dbo].[T_Category_L](
[LargeCode] [int] NOT NULL,
[LargeName] [nvarchar](50) NULL,
[Deleted] [bit] NOT NULL,
[Updated] [datetime] NOT NULL,
[Created] [datetime] NOT NULL,
CONSTRAINT [PK_T_Category_L] PRIMARY KEY CLUSTERED
(
[LargeCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[T_Category_L] ADD CONSTRAINT [DF_T_Category_L_Deleted] DEFAULT ((0)) FOR [Deleted]
GO


T_Category_M
CREATE TABLE [dbo].[T_Category_M](
[MiddleCode] [int] NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[LargeCode] [int] NOT NULL,
[Deleted] [bit] NOT NULL,
[Updated] [datetime] NOT NULL,
[Created] [datetime] NOT NULL,
CONSTRAINT [PK_T_Category_M] PRIMARY KEY CLUSTERED
(
[MiddleCode] ASC,
[LargeCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[T_Category_M] ADD CONSTRAINT [DF_T_Category_M_Deleted] DEFAULT ((0)) FOR [Deleted]
GO


T_Category_S
CREATE TABLE [dbo].[T_Category_S](
[SmallCode] [int] NOT NULL,
[SmallName] [nvarchar](50) NULL,
    [LargeCode]  [int] NOT NULL,
[MiddleCode] [int] NOT NULL,
[Deleted] [bit] NOT NULL,
[Updated] [datetime] NOT NULL,
[Created] [datetime] NOT NULL,
CONSTRAINT [PK_T_Category_S] PRIMARY KEY CLUSTERED
(
[SmallCode] ASC,
[LargeCode] ASC,
[MiddleCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[T_Category_S] ADD CONSTRAINT [DF_T_Category_S_Deleted] DEFAULT ((0)) FOR [Deleted]
GO


上記のテーブル構造に対して 以下のデータを作成して INSERT します。

vb_dataset_multilayer_02.png



2.データセットの作成方法

以下の手順でソースを実装します。
(1)まず、それぞれのデータをSQL Server のテーブルからデータテーブルに取得します。
(2)取得したデータテーブルをひとつのデータセットにまとめます。
(3)リレーションを追加します。
(4)追加する際に、複数列のリレーションはカラム配列にして追加します。
(5)ネストを有効にします。

DataSetTest.vb

Public Class DataSetTest
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not IsPostBack Then

Dim dbUtil As New DbUtility()
Dim ds1 As DataSet = Nothing
Dim ds2 As DataSet = Nothing
Dim ds3 As DataSet = Nothing
Dim sql1 As New StringBuilder
Dim sql2 As New StringBuilder
Dim sql3 As New StringBuilder

'大カテゴリ取得
sql1.AppendLine(" SELECT LargeCode ")
sql1.AppendLine(" ,LargeName ")
sql1.AppendLine(" FROM T_Category_L ")
sql1.AppendLine(" ; ")

'中カテゴリ取得
sql2.AppendLine(" SELECT MiddleCode ")
sql2.AppendLine(" ,MiddleName ")
sql2.AppendLine(" ,LargeCode ")
sql2.AppendLine(" FROM T_Category_M ")
sql2.AppendLine(" ; ")

'小カテゴリ取得
sql3.AppendLine(" SELECT SmallCode ")
sql3.AppendLine(" ,SmallName ")
sql3.AppendLine(" ,LargeCode ")
sql3.AppendLine(" ,MiddleCode ")
sql3.AppendLine(" FROM T_Category_S ")
sql3.AppendLine(" ; ")

dbUtil.Connect()
dbUtil.ClearParams()

'データを取得する
ds1 = dbUtil.ExecuteFill(sql1.ToString, "CategoryLarge")
ds2 = dbUtil.ExecuteFill(sql2.ToString, "CategoryMiddle")
ds3 = dbUtil.ExecuteFill(sql3.ToString, "CategorySmall")

'既存のデータセットから削除する
Dim dt1 As DataTable = ds1.Tables("CategoryLarge")
Dim dt2 As DataTable = ds2.Tables("CategoryMiddle")
Dim dt3 As DataTable = ds3.Tables("CategorySmall")
ds2.Tables.Remove(ds2.Tables("CategoryMiddle"))
ds3.Tables.Remove(ds3.Tables("CategorySmall"))

'まとめ用のデータセットに追加する
ds1.Tables.Add(dt2)
ds1.Tables.Add(dt3)

'リレーションを追加する
'リレーション(親→子)(単数列)
ds1.Relations.Add("Category_Large-Middle",
dt1.Columns("LargeCode"),
dt2.Columns("LargeCode"))
ds1.Relations(0).Nested = True

'リレーション(子→孫)(複数列)
ds1.Relations.Add("Category_Middle-Small",
New DataColumn() {dt2.Columns("LargeCode"), dt2.Columns("MiddleCode")},
New DataColumn() {dt3.Columns("LargeCode"), dt3.Columns("MiddleCode")}
)
ds1.Relations(1).Nested = True

ds1.AcceptChanges()

'データバインド
Me.rptLargeCategory.DataSource = dt1
Me.rptLargeCategory.DataBind()

End If

End Sub

End Class



以上で データセットの内部にデータテーブルのリレーションを作成することができます。実際に使用した例を次回の記事「多階層構造のリピーターコントロールにデータバインドする方法」にてご紹介していますので、ご参考頂ければ幸いです。





最後までお読みいただき、ありがとうございます。
他にも VB.net に関する記事 をご紹介しておりますのでご参考頂ければ幸いです。



関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。