C# .NET6 macOS MySQLデータ取得 / カラム名一覧取得

C# .NET6 macOS MySQLデータ取得 / カラム名一覧取得

C# .NET6MySQL接続するためmacOSのターミナルから[パッケージを組込む]ための「add package」コマンドを実行します。

dotnet add package MySql.Data --version 8.0.28

MySQLで下のtestという名称のテーブルを用意しました。

testテーブル

このtestテーブル内容をC# .NET6から取得する2つのコード例です。

MySqlCommandのExecuteReader()を使う場合

using MySql.Data.MySqlClient;
using System.Data;
string mysqlConnectStr = string.Format("Server={0};Database={1};Uid={2};Pwd={3};Charset={4}", "127.0.0.1", "x", "x", "x", "utf8");

var mysqlConnect = new MySqlConnection(mysqlConnectStr);
mysqlConnect.Open();
var myCommand = new MySqlCommand("select * from test", mysqlConnect);

var read = myCommand.ExecuteReader();
while(read.Read()){
    Console.WriteLine("{0}, {1}", read["title"],read[1]);
}
mysqlConnect.Close();

カラム名でもカラムインデックスでも取得可能でした。

MySqlDataAdapterを使う場合

using MySql.Data.MySqlClient;
using System.Data;
string mysqlConnectStr = string.Format("Server={0};Database={1};Uid={2};Pwd={3};Charset={4}", "127.0.0.1", "x", "x", "x", "utf8");

var mysqlConnect = new MySqlConnection(mysqlConnectStr);
mysqlConnect.Open();
var myCommand = new MySqlCommand("select * from test", mysqlConnect);

var rows = new MySqlDataAdapter(myCommand);
var dt = new DataTable();
rows.Fill(dt);

foreach(DataRow line in dt.Rows){
    foreach(var col in dt.Columns){
        Console.WriteLine("Column Name = {0}, Value = {1}", col, line[col.ToString()]);
    }
}
mysqlConnect.Close();

DataTableを使ってColumn名を取り出しています。

C# .NET6 macOS Dictionary キー があるかどうか

C# .NET6 macOS Dictionary キー一覧

C#Dictionaryでキーがあるかどうかを確認するにはContainsKey()を使います。下記はコード例です

var dic = new Dictionary<string,string>{
    {"名称", "ハインライン"}
};
if(dic.ContainsKey("名称")){ //"名称"というキーがあるかどうか
    Console.WriteLine(dic["名称"]);
}

キーが無い場合dic[“名称”]とすると下記のようなエラーがでました。

例外が発生しました: CLR/System.Collections.Generic.KeyNotFoundException
型 'System.Collections.Generic.KeyNotFoundException' のハンドルされていない例外が System.Private.CoreLib.dll で発生しました: 'The given key '名称' was not present in the dictionary.'

その場合TryGetValue()を使って取得もできるのですがあまりメリットを感じない

var dic = new Dictionary<string,string>{
    {"名称", "ハインライン"}
};
string outstr = "";
if (dic.TryGetValue("名称",out outstr))
    Console.WriteLine(outstr);

Dictionaryキーが無い場合TryGetValue()で試すとout TValueの中身がnullになるようでした。

Dictionary キー一覧取得

var dic = new Dictionary<string,string>{
    {"名称", "ハインライン"}
};
foreach(var a in dic.Keys){
    Console.WriteLine("{0}={1}",a,dic[a]);
}

上記コードのようにKeysを使えばキー一覧(KeyCollection)を取得できます。

C# .NET6 macOS Excel読込 / 書込

C# .NET6 macOS Excel読込 / 書込

C# .NET6でExcelファイルを読書する場合NPOIと云うパッケージあります。NPOInugetで公開されていて、dotnetの「add package」コマンドを使えば簡単に利用できます。「add package」は下記のようにターミナルから実行します。

dotnet add package NPOI --version 2.5.5

Excelファイルを読み込んでセル内の文字列を取得

macOSのOffice365からExcelでファイル新規作成しました。ファイル名は「Book1.xlsx」です。セルA1に「ジュアン・リコ」という文字列を入れました。

Excelファイルを新規作成しBook1で保存
Excelファイルを新規作成しBook1.xlsxで保存

セルA1に入れた文字列をC# .NET6で取り出すコード例です。

using NPOI.XSSF.UserModel;
var book = new XSSFWorkbook("Book1.xlsx");
var sheet = book.GetSheet("Sheet1");
var row = sheet.GetRow(0);
var cell = row.GetCell(0);
Console.WriteLine(cell.StringCellValue);

最後の StringCellValueに「ジュアン・リコ」が入っていました。

VSCodeデバッグ実行
VSCodeデバッグ実行

コード例はシンプルに書いていますが、sheetをGetRow()やGetCell()する場合は、その行に何も入っていなければ問答無用でnullが入ります。nullチェックなどの処理は必要かと思います。

Excelファイルにデータ入れて保存

読み込んだ先程のExcelファイルのセルA1を書き換えて保存したい場合はStringCellValue()を使います。上のコードに下記を追記します

if (cell != null){
    cell.SetCellValue("ロジャー・ヤング");
}

Write()を実行するとセルA1の変更された内容が保存されます。

book.Write(new FileStream("Book2.xlsx",FileMode.OpenOrCreate));

Book2.xlsxというファイル名で保存しました。Book1で保存しなかった理由は、Office365で新規作成したExcelファイルに上書きするとデータがキレイに書けていないようでExcelで開くと下記のようなメッセージがでました。別ファイルで保存するとその後Excelで開くことも成功しました。

上書きするとExcelファイルが壊れた
上書きするとExcelファイルが壊れた

他の行やセルにデータを入れたい場合はGetRow()でnullが返るのでCreateRow()したあとCreateCell()する必要があります。

var row1 = sheet.CreateRow(1);
row1.CreateCell(0).SetCellValue("キャンプ・カリー");