約 3,139,149 件
https://w.atwiki.jp/sevenlives/pages/1186.html
データテーブル 読み:でーたてーぶる 英語:data table 別名: 意味: データテーブルとはデータセットに展開されたテーブル?のこと。 データセットを利用したRDB?の操作は直接データベースを操作せず、データセットに展開されたデータテーブルを操作することになります。 2008年03月06日 データセット
https://w.atwiki.jp/12kokuki/pages/39.html
データテーブル 各種登録データを格納するテーブル群。 ユーザ情報 サイト情報 カテゴリ 作品規模 基調 国 キャラ カップリング カップリング傾向 注意情報 更新履歴 2010/09/06 10 52 29
https://w.atwiki.jp/atachi/pages/57.html
使い方 [#e29fd504] スキーマの作成 [#g98e616c] DataTableからのデータ取得方法 [#bed19bb7] データの抽出 [#y82fe2f0] データの抽出(LINQ) [#dd09ccb8] データの集計 [#g8c1647f] DataTableの機能 [#u251e501] ある状態からの変更点を取得する(トランザクション機能) [#qb08d21c] .NET Frameworksバージョン1時代から実装されている、メモリ上で稼働する簡易的なオンメモリデータベースです。 MSDN DataTable データテーブルを理解しうまく使えるかどうかが、アプリケーション設計において非常に重要な要素となります。 データテーブルにはレコードの追加位置や削除されたレコードを記録されるため、後からそれらの情報を引き出すことができます。 また、ビュー機能を使うことで、任意の条件だけを含んだデータセットを抽出することができます。 DataTableの欠点としては、テーブルのフィールドに型の概念を持ち込めないことです。 スキームの指定時に格納可能なデータの型を設定できますが、これはDataTable内でのみ使用される内部情報(検索や集計、ソートなどの操作で使われる)だけです。 あるレコードのフィールドへのアクセスにはフィールド名を文字列で指定する必要があるので、タイプミスの問題や取得したデータはすべてobject型であり、プログラマが自分で型を調べキャストしなければならない。 CSVファイルからDataTableを作成するチュートリアル 使い方 // DataTableを作成 // - 強い型付けでカラムを定義 // - FirstNameカラムはstring型 // - LastNameカラムはstring型 // - AgeカラムはInt32型 DataTable table = new DataTable(); table.Columns.Add("FirstName", typeof(string)); table.Columns.Add("LastName", typeof(string)); table.Columns.Add("Age", typeof(Int32)); // レコードの追加 // - DataRowを使った方法 DataRow row; row = table.NewRow(); row["FirstName"] = "山田"; row["LastName"] = "太郎"; row["Age"] = 20; // - DataTable.Rowsにobject[]型でレコードを追加 table.Rows.Add(new object[] {"佐藤","健",23}); // レコードの参照 DataRow frow = table[0]; string firstName = table[0]["FirstName"]; // 同じ firstName = frow["FirstName"]; // // レコードの走査 foreach(DataRow crow in table.Rows) { // DataRowを使ってすべての行に対して処理 } // フィルタリング(DataViewの使用) DataView view = table.DefaultView; view.RowFilter = "Age 18"; // Ageフィールドの値が18以上のものだけを表示 for(int i=0;i view.Count;i++){ DataRow row = view[i]; } スキーマの作成 DataColumnを定義することで、DataTableにデータ構造のスキーマを定義します。 スキーマを与えると、正しくない値を含んだレコードをDataTableに追加した時にエラーの検出ができます。 DataColumnのプロパティ DataTypeプロパティはカラムが格納することができる型を指定します。 DataColumn.DataTypeを指定することで強い型付けされたDataTableを作成することができます。 ただし、プログラマが作成した独自の型は指定することはできません。 ReadOnlyプロパティ レコードの追加時のみ値を設定することができ、以降は読み取り専用となります。 AutoIncrementプロパティ DataTypeがint型の場合に、レコードが追加されるたびに「0」から インクリメントされた値を自動的に格納していきます。 AutoIncrementSeed や AutoIncrementStep と併用することで インクリメントの開始値や加算値を調整できます。 DefaultValueプロパティ カラムの初期値を設定します。 // カラムへスキームを設定するコード例 // - Decimal型 // - Nullを許容しない // - コメントに「Price」 // - カラム名は「Price」 // - 値が未設定の場合は「25」とする DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.Decimal"); column.AllowDBNull = false; column.Caption = "Price"; column.ColumnName = "Price"; column.DefaultValue = 25; DataTableからのデータ取得方法 DataTable.Rowsですべての行を走査する DataTable.Selectを使用して特定の行を取得する LINQを使用して特定の行を取得する(もっともオススメ) データの抽出 DataTable table = new DataTable(); // ... tableの初期化 var rows = table.Select("Message = Test Message OR FirstName like T% ","Message"); DataTable.Selectは遅いです。レコード数だけでなくフィールド数や各フィールドの型によって急激にパフォーマンスが悪くなることがあるので、使用する際はパフォーマンスを意識する必要があります。 データの抽出(LINQ) C#3以降ではLINQを使用してDataTableやコレクションからデータを探すことができます。 パフォーマンスではLINQを使用する方法がもっとも早い(DataTable.Selectを使うよりも2倍以上早い)。 LINQ DataTable table = new DataTable(); // ... tableの初期化 var rows = ( from row in table.AsEnumerable() let column0 = row.Field string ("Message") let column1 = row.Field string ("FirstName") where column0 == "Test Message" || column1.StartsWith("T") orderby column0 select row ).ToArray(); データの集計 DataTableを駆使してデータの集計を行った方法を下記サイトで紹介しています。 3流プログラマのメモ書き ただ、DataViewを使ったり、重複を削除した後に集計を自分で計算するなど、スマートでないというイメージがあります。 C#3以降ならばLINQを使ってうまくできるハズですが。 DataTableの機能 ある状態からの変更点を取得する(トランザクション機能) AcceptChanged()を呼び出してからの変更点をDataTableは記録しています。 GetChanged()を使って変更点を取得できます。引数に指定したものによって、削除されたレコード・追加されたレコード・変更されたレコードなどを取得できます。 DataTable table = new DataTable(); // ... テーブルの初期化 table.AcceptChanges(); // ここから // ... テーブルの処理 DataTable deleted = table.GetChanged(DataRowState.Deleted); // 削除されたレコードが含まれたテーブル if( daleted != null ) { // 削除されたレコードに対する処理を行う // deleted.RejectChanges()を呼び出すことで、この操作を無効にすることもできる。 }
https://w.atwiki.jp/12kokuki/pages/58.html
データテーブルを作る サイトに付随する登録データのうち、要素が可変のものは別テーブルに。そうすればサイト情報自体には入れなくていいから「カテゴリ用カラムをいくつ入れよう?」などと悩む必要もなくなります。 重要度(PRIORITY)を指定できるようにしておけば、サイトごとにそれでソート可能だし、登録数が多いようなら上限を設けて、一覧には一定数しか出さないようにすればいい(詳細情報ページには全部出す)。 したがって各種登録データを格納するテーブル群は、ユーザ情報とサイト情報以外はほとんど各マスタの値を保存するだけとなり、かなり小さなテーブルに。 たとえばこんなサイト情報(D_SITE)と基調(D_MOOD)が登録されていたとして、 ID NAME MEDIA 1 ほげほげ 0 2 ほにゃらら 1 3 ふにふに 0 SITE_ID MOOD_ID 1 1 1 3 2 1 こんなクエリを発行すれば、基調ごとの登録サイト数がわかります。 SELECT M.ID AS ID, M.NAME AS NAME, COUNT(D.SITE_ID) AS TOTAL FROM M_MOOD M, D_MOOD D WHERE M.ID = C.MOOD_ID GROUP BY ID ID NAME TOTAL 1 シリアス 2 3 ラブラブ 1 もっとも実際にはビューにするので、引っ張ってくるときにソート順をどうするかを考えるだけです。 メディアごとの登録サイト数は、これは他のテーブルではなくサイト情報自体が持っているデータなのでこんな感じ。 SELECT S.MEDIA AS ID, M.NAME || 向け AS NAME, COUNT(S.MEDIA) AS TOTAL FROM D_SITE S, M_MEDIA M WHERE S.MEDIA = M.ID GROUP BY S.MEDIA ID NAME TOTAL 0 PC向け 2 1 携帯向け 1 それにしても長年SQLを適当に書いてきたんで、どう書くのが正しいのかよくわからなかったり(^^; たとえば上記のSQLだと、別名をつけなくても結果のヘッダはID、NAMEになるように見えるのに、PHPで取得するときはその名前じゃアクセスできないんですよね。なので単純にするためにすべてASをつけたけど……本当はどうするのが正しいんだろ? 2010/09/06 10 54 08
https://w.atwiki.jp/12kokuki/pages/40.html
ユーザ情報(D_USER) ユーザ情報を格納するデータテーブル。まずユーザ登録をしてからサイト情報を登録するという流れにするので。 2010/09/06 10 58 47
https://w.atwiki.jp/12kokuki/pages/51.html
国(D_COUNTRY) テーブル定義 PK 名称 データ型 NOT NULL 内容 ● SITE_ID INTEGER ○ サイト情報のID ● COUNTRY_ID INTEGER ○ 国マスタのID PRIORITY INTEGER 重要度 CREATE文 CREATE TABLE [D_COUNTRY]( [SITE_ID] INTEGER NOT NULL ,[COUNTRY_ID] INTEGER NOT NULL ,[PRIORITY] INTEGER ,PRIMARY KEY(SITE_ID,COUNTRY_ID) ); 2010/09/06 10 55 37
https://w.atwiki.jp/12kokuki/pages/50.html
基調(D_MOOD) テーブル定義 PK 名称 データ型 NOT NULL 内容 ● SITE_ID INTEGER ○ サイト情報のID ● MOOD_ID INTEGER ○ 基調マスタのID PRIORITY INTEGER 重要度 CREATE文 CREATE TABLE [D_MOOD]( [SITE_ID] INTEGER NOT NULL ,[MOOD_ID] INTEGER NOT NULL ,[PRIORITY] INTEGER ,PRIMARY KEY(SITE_ID,MOOD_ID) ); 2010/09/06 10 55 54
https://w.atwiki.jp/12kokuki/pages/52.html
キャラ(D_CHARA) テーブル定義 PK 名称 データ型 NOT NULL 内容 ● SITE_ID INTEGER ○ サイト情報のID ● CHARA_ID INTEGER ○ キャラマスタのID PRIORITY INTEGER 重要度 CREATE文 CREATE TABLE [D_CHARA]( [SITE_ID] INTEGER NOT NULL ,[CHARA_ID] INTEGER NOT NULL ,[PRIORITY] INTEGER ,PRIMARY KEY(SITE_ID,CHARA_ID) ); 2010/09/06 10 55 19
https://w.atwiki.jp/12kokuki/pages/55.html
更新履歴(D_HIST) こういうテーブルを設けることで、サイト紹介文から更新内容を排除。全登録サイトを対象にして、更新履歴の新しい順の一覧を作るなんてのも簡単にできるし。 テーブル定義 PK 名称 データ型 NOT NULL 内容 ● SITE_ID INTEGER ○ サイト情報のID ● UPD_DATE TEXT ○ 更新日 TEXT TEXT ○ 更新内容 一レコードに一日の更新内容を登録(なので同じ日付で複数の履歴レコードを登録するのは不可)。 更新日(UPD_DATE)がTEXT型なのは、SQLiteには日付や時刻用のデータ型がなく、テキストで持つか数値で持つかしかないため。関数はいろいろあるので、Date型やDateTime型、Timestamp型が普通にあると勘違いしちゃうけどね。 CREATE文 CREATE TABLE [D_HIST]( [SITE_ID] INTEGER NOT NULL ,[UPD_DATE] TEXT NOT NULL ,[TEXT] TEXT NOT NULL ,PRIMARY KEY(SITE_ID,UPD_DATE) ); 2010/09/06 10 54 26
https://w.atwiki.jp/12kokuki/pages/43.html
カテゴリ(D_CATE) テーブル定義 PK 名称 データ型 NOT NULL 内容 ● SITE_ID INTEGER ○ サイト情報のID ● CATE_ID1 INTEGER ○ カテゴリマスタのID1 ● CATE_ID2 INTEGER ○ カテゴリマスタのID2 PRIORITY INTEGER 重要度(数が小さいほど高い) CREATE文 CREATE TABLE [D_CATE]( [SITE_ID] INTEGER NOT NULL ,[CATE_ID1] INTEGER NOT NULL ,[CATE_ID2] INTEGER NOT NULL ,[PRIORITY] INTEGER ,PRIMARY KEY(SITE_ID,CATE_ID1,CATE_ID2) ); 2010/09/06 10 53 48