プログラム言語 データ型:DataSet型

DataTable型

using System.Data;

DataTable myTable = new DataTable();
※名前も付けられる。
DataTable myTable = new DataTable(tableName:”MyTable”);

列定義(名前、型)
(1)DataColumnオブジェクトに定義⇒DataTableに格納
DataColumn myCol1 = new DataColumn(columnName:”col1″,dataType:typeof(int));
myTable.Columns.Add(column: myCol1);

(2)DataColumnオブジェクトに定義と同時にDataTableに格納
myTable.Columns.Add(column: new DataColumn(columnName: "col2″, dataType: typeof(int)));

(3)DataColumnオブジェクトを定義せず、DataTableに格納
myTable.Columns.Add(columnName: "name3″, type: typeof(string));

//行データを作成(1行目)
DataRow myRow = myTable.NewRow();

//行定義(定義済み列情報も行データに格納されている)
myRow[“name1”] = 5;
myRow[“name2”] = 10;
myRow[“name3”] = "test";

//行データをDataTableへ格納
myTable.Rows.Add(row: myRow);

//行データを作成(2行目)
myRow = myTable.NewRow();

myRow[“name1”] = 50;
myRow[“name2”] = "test2";
myRow[“name3”] = 1000;

myTable.Rows.Add(row: myRow);

//行データLoop&データ取得
foreach (DataRow elm in myTable.Rows)
{
  Console.WriteLine(elm[“name1”].ToString());
  ⇒ 5、50
}

//抽出条件、順序を指定
string sqlWhere = "name1 = 100";
string sqlOrder = "name1 ASC"; //DESC
foreach (DataRow elm in myTable.Select(filterExpression: sqlWhere, sort: sqlOrder))
{
  Console.WriteLine(elm[“name1”].ToString());
  ⇒ 100
}

Dim myTable As New DataTable
'※名前も付けられる。Dim myTable As New DataTable(tableName:="MyTable")

'列定義(名前、型)

'(1)DataColumnオブジェクトに定義⇒DataTableに格納
Dim myCol1 As New DataColumn(columnName:="col1", dataType:=GetType(Integer))
myTable.Columns.Add(column:=myCol1)

'(2)DataColumnオブジェクトに定義と同時にDataTableに格納
myTable.Columns.Add(column:=New DataColumn(columnName:="col2", dataType:=GetType(Integer)))

'(3)DataColumnオブジェクトを定義せず、DataTableに格納
myTable.Columns.Add(columnName:="name3", type:=GetType(String))

'行データを作成(1行目)
Dim myRow As DataRow = myTable.NewRow()

'行定義(定義済み列情報も行データに格納されている)
myRow("name1") = 5
myRow("name2") = 10
myRow("name3") = "test"

'行データをDataTableへ格納
myTable.Rows.Add(row:=myRow)

'行データを作成(2行目)
myRow = myTable.NewRow()

myRow("name1") = 50
myRow("name2") = "test2"
myRow("name3") = 1000

myTable.Rows.Add(row:=myRow)

'行データLoop&データ取得
For Each elm As DataRow In myTable.Rows
 Console.WriteLine(elm("name1").ToString())
 '⇒ 5、50
Next elm

'抽出条件、順序を指定
Dim sqlWhere As String = "name1 = 100″"
Dim sqlOrder As String = "name1 ASC"  'DESC
For Each elm As DataRow In myTable.Select(filterExpression:=sqlWhere, sort:=sqlOrder)
 Console.WriteLine(elm("name1").ToString())
 '⇒ 100
Next elm

DataSet
DataTableを更に格納するテーブル型変数

Dim mySet As New DataSet

mySet.Tables.Add(New DataTable(tableName:="myTable1"))
mySet.Tables.Add(New DataTable(tableName:="myTable2"))

Console.WriteLine(mySet.Tables(index:=0).Rows(index:=0).Item(columnIndex:=0))

VB6ではDataTable型は無く、RecordSet型。
DataTableがDataSetに複数のDataTableを格納できるのに対して、RecordSetは単一テーブルのみ。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

re.Open
rs.Filter = "売上高 >= 500000"

If rs.RecordCount > 0 Then
  Do Until rs.EOF
    Debug.Print(re.Fields("fld"))
    rs.MoveNext
  Loop
End If

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

DataSet型

DataTableを更に格納するテーブル型変数

DataSet mySet = new DataSet();

mySet.Tables.Add(new DataTable(tableName: "myTable1"));
mySet.Tables.Add(new DataTable(tableName: "myTable2"));

Console.WriteLine(mySet.Tables[index: 0].Rows[index: 0][columnIndex: 0].ToString());

mySet.AcceptChanges();
myTable.AcceptChanges();
myRow.AcceptChanges();

DataRelation型

親テーブル
DataTable myTable1 = new DataTable(tableName: @"MyTable1");

列定義(名前、型)
myTable1.Columns.Add(new DataColumn("col1", typeof(int)));
myTable1.Columns.Add(new DataColumn("col2", typeof(string)));
myTable1.Columns.Add(new DataColumn("col3", typeof(string)));
myTable1.PrimaryKey = new DataColumn[] { myTable1.Columns["col1"] };

foreach (var i in Enumerable.Range(start: 1, count: 10).Select(_ => _))
{
 行データを作成(1行目)
 DataRow myRow = myTable1.NewRow();
 
 行定義(定義済み列情報も行データに格納されている)
 myRow[0] = i;
 myRow[1] = i.ToString();
 myRow[2] = "test1";
 
 行データをDataTableへ格納
 myTable1.Rows.Add(row: myRow);
}

子テーブル
DataTable myTable2 = new DataTable(tableName: @"MyTable2");

列定義(名前、型)
myTable2.Columns.Add(new DataColumn("col1", typeof(int)));
myTable2.Columns.Add(new DataColumn("col2", typeof(int)));
myTable2.Columns.Add(new DataColumn("col3", typeof(string)));
myTable2.PrimaryKey = new DataColumn[] { myTable2.Columns["col1"] };

var keys = new[] { 1, 2, 3, 1, 2, 3, 1, 2, 3, 4 };

foreach (var i in Enumerable.Range(start: 1, count: 10).Select(_ => _))
{
 行データを作成(1行目)
 DataRow myRow = myTable2.NewRow();
 
 行定義(定義済み列情報も行データに格納されている)
 myRow[0] = i;
 myRow[1] = keys[i-1];
 myRow[2] = "test2";
 
 行データをDataTableへ格納
 myTable2.Rows.Add(row: myRow);
}

DataSet mySet = new DataSet();
mySet.Tables.Add(table: myTable1);
mySet.Tables.Add(table: myTable2);

リレーション作成
var myRelation = new DataRelation(
 relationName: "MyRelation",
 parentColumn: myTable1.Columns["col1"],
 childColumn: myTable2.Columns["col2"]);
mySet.Relations.Add(myRelation);

foreach (DataRow row in myTable1.Rows)
{
 親テーブルのキーを持つレコードのみ抽出
 foreach (DataRow elm in row.GetChildRows("MyRelation"))
 {
  Console.WriteLine(elm[0] + ":" + elm[1] + ":" + elm[2]);
 }
}

foreach (DataRow row in myTable2.Rows)
{
 子テーブルのキーを持つレコードのみ抽出
 foreach (DataRow elm in row.GetParentRows("MyRelation"))
 {
  Console.WriteLine(elm[0] + ":" + elm[1] + ":" + elm[2]);
 }
}