C#のDataSetとDataTableとDataColumnとDataRow

C#にはデータベースから取得したデータをメモリ上に格納する為のクラス「DataSet」があります。

DataSetクラスは、DataTableクラスで構成されていて、

DataTableクラスは、DataColumnクラスやDataRowクラスで構成されています。

 

ここでは、DataSetクラスの構造について解説します。

System.Data.DataSetクラス

DataSet クラスは、データベースに相当するクラスです。

 

データベースは複数のテーブルを持つことができます。

同じようにDataSetクラスは、テーブルに相当する DataTable オブジェクトを複数持つことができます。

 

各DataTableオブジェクトには「Tables」プロパティからアクセスする事ができます。

「Tables」プロパティはインデックス番号やテーブル名のどちらを使ってもアクセスが可能です。

var ds = new DataSet();                            // DataSetを作成
var dt = new DataTable("TestTable");               // テーブル名を付けてDataTableを作成

ds.Tables.Add(dt);                                 // DataSetのTablesにDataTableを追加

var work1 = ds.Tables[0];                          // インデックス番号でDataTableへアクセス
var work2 = ds.Tables["TestTable"];                // テーブル名でDataTableへアクセス

System.Data.DataTableクラス

DataTableクラスは、データベースのテーブルに相当するクラスです。

 

データベースのテーブルは列と行で構成されたデータを格納します。

それぞれの列には列名や格納できるデータ型などのスキーマ(形式)が決められていて、そのスキーマに従って行が作られています。

 

同じようにDataTableクラスは、スキーマとデータを格納します。

スキーマに相当する DataColumnオブジェクトとデータに相当する DataRowオブジェクトを持ちます。

 

スキーマは「Columns」プロパティからアクセスする事ができ、

データは「Rows」プロパティからアクセスする事ができます。

「Columns」プロパティはインデックス番号や列名のどちらを使ってもアクセスが可能です。

「Rows」プロパティはインデックス番号(行番号)でアクセスします。

var dt = new DataTable("TestTable");

var dc1 = new DataColumn("TestField1", typeof(int));    //列名と型を決めてスキーマを作成
var dc2 = new DataColumn("TestField2", typeof(string)); //列名と型を決めてスキーマを作成

dt.Columns.Add(dc1);                                    //テーブルにスキーマを追加
dt.Columns.Add(dc2);                                    //テーブルにスキーマを追加

var work1 = dt.Columns[0];                              //インデックス番号でアクセス
var work2 = dt.Columns["TestField2"];                   //行名でアクセス

var dr1 = dt.NewRow();                                  //行はNewRowメソッドで作成
var dr2 = dt.NewRow();                                  //行はNewRowメソッドで作成

dt.Rows.Add(dr1);                                       //テーブルに行を追加
dt.Rows.Add(dr2);                                       //テーブルに行を追加

var workRow = dt.Rows[0];

System.Data.DataColumnクラス

DataColumnクラスは、テーブルの列スキーマを格納するクラスです。

 

テーブルの列が格納できるデータ型の種類や既定値などの情報を管理します。

System.Data.DataRowクラス

DataRowクラスは、テーブルの1行分のデータを格納するクラスです。

 

DataRowクラスは new をつかってインスタンスを作成する事は出来ません。

代わりに DataTable クラスの NewRowメソッドを使ってインスタンスを作成します。

 

DataTable へ追加する事ができるデータは、その DataTable が管理する列のスキーマが定める構造になっている必要があります。NewRowメソッドを使う事でスキーマの構造で DataRow を作成する事ができます。

var dt = new DataTable("TestTable");

var dr1 = dt.NewRow();                                  //行はNewRowメソッドで作成
var dr2 = dt.NewRow();                                  //行はNewRowメソッドで作成

dt.Rows.Add(dr1);                                       //テーブルに行を追加
dt.Rows.Add(dr2);                                       //テーブルに行を追加

DataRowの各列のデータにはインデクサーを使ってアクセスします。

インデックス番号と列名のどちらを使ってもアクセスが可能です。

dr1[0] = 1;
dr1["TestField2"] = "a";

dt.Rows[0]["TestField2"] = "a";