✅ DB接続デモ

IDbConnectionFactory パターンによるRDBMS非依存の接続管理を体験するデモ

📚 IDbConnectionFactory パターン

接続先DBをコードを変えずに設定だけで切り替えられる設計パターンです。

インターフェース(RDBMS非依存)
public interface IDbConnectionFactory
{
    string DatabaseType { get; }
    IDbConnection CreateConnection();
    Task<IDbConnection> CreateOpenConnectionAsync();
    Task<bool> TestConnectionAsync();
}
appsettings.json(設定で切り替え)
{
  "Database": {
    "Provider": "SQLite"  // ← ここを変えるだけ
  },
  "ConnectionStrings": {
    "DemoSQLite": "Data Source=demo.db;"
  }
}
DI登録(Program.cs)
// Provider設定に応じてファクトリを切り替え
var connectionString = builder.Configuration.GetConnectionString("DemoSQLite");
builder.Services.AddSingleton<IDbConnectionFactory>(sp =>
    new SqliteConnectionFactory(connectionString, sp.GetRequiredService<ILogger<SqliteConnectionFactory>>()));

// Service は IDbConnectionFactory に依存するだけ(RDBMS種別を意識しない)
builder.Services.AddScoped<IDatabaseConnectionDemoService, DatabaseConnectionDemoService>();

🧪 デモ 1: 接続テスト

Factory 経由でDBに接続し、接続状態・DB種別・接続時間を確認します。

// Repository での使用例
public async Task DoSomethingAsync()
{
    using var connection = await _factory.CreateOpenConnectionAsync();
    // ... クエリ実行
} // ← using で自動的にClose・Dispose

🧪 デモ 2: テーブル一覧取得

SQLite の sqlite_master テーブルから存在するテーブル一覧を取得します。

// SQLite のメタデータテーブルを使用
var command = connection.CreateCommand();
command.CommandText =
    "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";

🧪 デモ 3: 行数取得(SQLインジェクション対策)

テーブルの行数を取得します。テーブル名はホワイトリスト検証でSQLインジェクションを防ぎます。

// NG: 文字列連結(SQLインジェクションの危険)
command.CommandText = $"SELECT COUNT(*) FROM " + tableName;

// OK: ホワイトリスト検証してから使用
var tables = await GetTablesAsync();
if (!tables.Contains(tableName))
    throw new ArgumentException("テーブルが存在しません");
command.CommandText = $"SELECT COUNT(*) FROM "{tableName}"";

🔗 参考リンク