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名を取り出しています。

Lambda Node.js MySQL接続でのUnknown application error occurred

PROTOCOL_SEQUENCE_TIMEOUT

AWS LambdaNode.js 12で関数を作成し、npm install mysqlを使ってMySQLデータベースに接続した場合、何度か実行していたらたまに「Internal Server Error」出ていましてLOGを見ると「Unknown application error occurred」と書いていました。

LOGを追っていくと下記のような「Quit inactivity timeout」を発見した。

2020-12-31T09:53:06.051Z	8d702d7b-XXXX-XXXX-99a1-XXXXX231d3ad	ERROR	Uncaught Exception 	{
    "errorType": "Error",
    "errorMessage": "Quit inactivity timeout",
    "code": "PROTOCOL_SEQUENCE_TIMEOUT",
    "fatal": true,
    "timeout": 30000,
    "stack": [
        "Error: Quit inactivity timeout",
        "    at Quit.<anonymous> (/var/task/node_modules/mysql/lib/protocol/Protocol.js:160:17)",
        "    at Quit.emit (events.js:314:20)",
        "    at Quit._onTimeout (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:124:8)",
        "    at Timer._onTimeout (/var/task/node_modules/mysql/lib/protocol/Timer.js:32:23)",
        "    at listOnTimeout (internal/timers.js:554:17)",
        "    at processTimers (internal/timers.js:497:7)"
    ]
}

原因は、MySQLとのコネクションを切るためのend()でした。

end(callback?: (err?: MysqlError) => void): void;
end(options: any, callback: (err?: MysqlError) => void): void;

上記のようになってるので、Promiseでラップした方がいいようでした。

const mysqlEnd  = () => {
	return new Promise((resolve, reject) => {
		try {
			mysqlのインスタンス.end({timeout: 3000}, (err) => {
				if (err) {
					console.log(err)
					reject(null)
				} else {
					resolve(null)
				}
			})
		} catch (_e1) {
			console.log(_e1)
		}
	})   
}

これで、いまのところ「Internal Server Error」は出ていません。たまにしか症状が出ないので確認が出来ていません。

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED