using Apq.Cfg.Database;
namespace Apq.Cfg.Samples.Demos;
///
/// 示例 10: 数据库配置源
/// 注意:需要运行数据库服务才能执行此示例
///
public static class DatabaseDemo
{
public static async Task RunAsync(string baseDir)
{
Console.WriteLine("═══════════════════════════════════════════════════════════════");
Console.WriteLine("示例 10: 数据库配置源");
Console.WriteLine("═══════════════════════════════════════════════════════════════\n");
Console.WriteLine("注意:此示例需要运行数据库服务\n");
// 使用 SQLite 作为示例(无需额外服务)
var dbPath = Path.Combine(baseDir, "config.db");
try
{
Console.WriteLine("10.1 使用 SQLite 数据库配置源:");
Console.WriteLine($" 数据库文件: {dbPath}");
var cfg = new CfgBuilder()
.AddDatabase(options =>
{
options.Provider = "SQLite";
options.ConnectionString = $"Data Source={dbPath}";
options.Table = "AppConfig";
options.KeyColumn = "ConfigKey";
options.ValueColumn = "ConfigValue";
}, level: 0, isPrimaryWriter: true)
.Build();
Console.WriteLine(" 已连接到 SQLite 数据库");
// 写入配置
Console.WriteLine("\n10.2 写入配置到数据库:");
cfg.Set("App:Name", "DatabaseApp");
cfg.Set("App:Version", "1.0.0");
cfg.Set("Database:MaxConnections", "100");
await cfg.SaveAsync();
Console.WriteLine(" 已写入 3 个配置项");
// 读取配置
Console.WriteLine("\n10.3 从数据库读取配置:");
Console.WriteLine($" App:Name = {cfg.Get("App:Name")}");
Console.WriteLine($" App:Version = {cfg.Get("App:Version")}");
Console.WriteLine($" Database:MaxConnections = {cfg.Get("Database:MaxConnections")}");
// 修改配置
Console.WriteLine("\n10.4 修改配置:");
cfg.Set("App:Version", "2.0.0");
await cfg.SaveAsync();
Console.WriteLine($" 修改后 App:Version = {cfg.Get("App:Version")}");
// 删除配置
Console.WriteLine("\n10.5 删除配置:");
cfg.Remove("App:Name");
cfg.Remove("App:Version");
cfg.Remove("Database:MaxConnections");
await cfg.SaveAsync();
Console.WriteLine(" 已清理测试配置");
cfg.Dispose();
// 等待数据库连接完全释放
await Task.Delay(100);
GC.Collect();
GC.WaitForPendingFinalizers();
// 清理数据库文件
try
{
if (File.Exists(dbPath))
File.Delete(dbPath);
}
catch
{
// 忽略删除失败
}
Console.WriteLine("\n10.6 其他数据库支持:");
Console.WriteLine(" - SqlServer: Provider=\"SqlServer\"");
Console.WriteLine(" - MySQL: Provider=\"MySql\"");
Console.WriteLine(" - PostgreSQL: Provider=\"PostgreSQL\"");
Console.WriteLine(" - Oracle: Provider=\"Oracle\"");
Console.WriteLine("\n[示例 10 完成]\n");
}
catch (Exception ex)
{
Console.WriteLine($" [跳过] 数据库服务不可用: {ex.Message}");
// 等待连接释放后再删除
await Task.Delay(100);
GC.Collect();
GC.WaitForPendingFinalizers();
try
{
if (File.Exists(dbPath))
File.Delete(dbPath);
}
catch
{
// 忽略删除失败
}
Console.WriteLine("\n[示例 10 跳过]\n");
}
}
}