データベースを扱っている上で基本となるDataTable(データテーブル)の取扱いですが、データの絞込や指示について手順を忘れていることが多いので、次回のために備忘録を作成しています。
大量のデータも軽量で扱えるDataTable
少量のデータであれば変数を使って取り扱うことができます。
例えばDataGridViewのカラム数分のデータであれば下記のように『int[]』でカラム数分の変数を発生させ、そこに格納していくことで対応できます。
int[] intColumns = new int[dataGridView.Columns.Count];
1行、1次元であればこれで済みますが、それが1,000行分となると2次元的にデータを扱うことになり、しかも1,000行×20列などとなれば20,000個も変数を扱うことになり、管理する側も頭が追いつきません。
そこで、データテーブルを使います。
データテーブルの宣言は1行でできます。
DataTable dtTbl_Viewer = new DataTable();
ExcelもDataTable化
Excelも読取だけであれば簡単にデータテーブルを作る事ができます。
下記コードはExcelをデータテーブル化して、シート数と1個目(0番)のシート名を取得しているコードです。
using (FileStream filestream_Excel = System.IO.File.Open(@var_Excel_File_Path, FileMode.Open, FileAccess.Read))
using (IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(filestream_Excel))
{
var ds_Data_Set_Excel = excelReader.AsDataSet();
int int_SheetCount = ds_Data_Set_Excel.Tables.Count;
string str_SheetName = ds_Data_Set_Excel.Tables[0].TableName
if (filestream_Excel != null) { filestream_Excel.Close(); } }
}
これの取扱いは別の記事をご参照ください。
絞込
データを在る条件で絞り込もうというときは『Select』を使います。
仮に『dtTbl_Viewer』というデータテーブルがあり、データグリッドビューで表示していたとします。このデータテーブルの3列目(列番号2)が都道府県であったとして、その列が『兵庫県』のデータだけを表示したかったとします。
その場合、『Select』の中に記述する絞込の構文は『[都道府県] =’兵庫県’』となります。
下記コードではカラム名『都道府県』は文字で指定ではなく引用しています。『dtTbl_Viewer』のカラム番号『2』のカラム名(ColumnName)を文字列(ToString)で取得して条件文に入れます。
カラム名の前後にある『[ ]』ですが、これは省略可能です。ただし、カラム名に『%』などの記号が入っていた場合、条件設定としての『%』と識別できないためカラム名の途中から絞込条件が作られてしまいます。無難なのは括弧を入れて置くことです。
DataTable dtTbl_Reference = new DataTable();
string str_Search = "[" + dtTbl_Viewer.Columns[2].ColumnName.ToString() + "]" + "='" + "兵庫県" + "'";
if (dtTbl_Viewer.Select(str_Search ).Count() > 0)
{
dtTbl_Reference = dtTbl_Viewer.Select(str_Search ).CopyToDataTable();
dtTbl_Reference.TableName = str_Search .TableName;
}
このコードでは『if』でレコードが1つ以上あること(0超過)を確認しています。ゼロの場合、色々と不都合があるためです。セレクト(Select)構文では後ろにカウント(Count)を付ければ行数(レコード数)を取得できます。
dtTbl_Viewer.Select(str_Search ).Count() > 0
問題なければ『CopyToDataTable』で丸ごとコピーします。
dtTbl_Viewer.Select(str_Search ).CopyToDataTable();
この丸写し処理でもコピーされないのがテーブル名です。なぜかわかりませんし、テーブル名を使わない場合は問題ないと思いますが、筆者のプログラムではテーブル名を識別して処理するコードがあるため明示的に下記コードを入れています。
dtTbl_Reference.TableName = str_Search .TableName;
指示
絞込の場合、指定した条件に合致するデータ以外は消えてしまいます。
全件表示したままで、目的のデータを見つけ出す方法として、以下の方法があります。
非常に姑息的ですが。
if (long.TryParse(txbS.Text, out long longS))
for (intR = intF; intR < intC; intR++)
{
if(long.TryParse(dataGridView.Rows[intR].Cells[intC].Value.ToString(), out longR))
{ if (longR >= longS) { break; }
}
『intF』は前回の指示での終わり値です。初出の場合はゼロになるようにします。
『intC』はカラム番号です。
『intR』は週回数です。for構文で使います。
『longS』は検索の基準とする数値です。テキストボックスに入力した文字を数値変換しています。
数値しか扱わないのであればテキストボックスを数値限定にすることもできますが、文字や日付など色々と扱う場合にはTryParseで変換します。
for構文ではデータグリッドビューを1行ずつ確認していきます。
データグリッドビューのセルを1つずつ、数値変換(long.TryParse)で数値化し、longSと比較します。
今回は以上『>=』にしていますが、この企業は任意に変更できます。
おわりに
今回は絞込や指示についての備忘録でした。
特に『Select』構文で項目名に『[ ]』を付けることで思わぬエラーを回避できたことをメモしておきました。
関連記事
- [C#備忘録]XML・DataTable絞込・指示 | AmpiTa Project
- [C#備忘録]複数のNumericUpDownから最適値を探す | AmpiTa Project
- [備忘録]PHP7.4⇒8.0 アップ … ウェブページのデータベース接続構文を変更 | AmpiTa Project
- [C#備忘録]高DPIへの対応(目標未達) | AmpiTa Project
- [C#備忘録]HTMLファイルでレポート | AmpiTa Project
- [C#備忘録]画像ファイル出力 | AmpiTa Project
- [C#備忘録]Excelファイルをインポート | AmpiTa Project
- [C#備忘録]XMLファイルで集計 | AmpiTa Project
- [C#備忘録]定型化のためのGroupBox利用とTextBox配置 | AmpiTa Project
- [C#備忘録]新規フォーム追加/Size/Location/Position | AmpiTa Project