DefaultDatabaseConfigPage.xaml.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Media;
  5. using TeamAAS.Database.Services;
  6. namespace TeamAAS.Database.UI
  7. {
  8. /// <summary>
  9. /// 默认数据库「配置/调试页」(对齐 Camera 的 DefaultCameraDebugPage):绑定「当前产品」的 ProductDatabase,
  10. /// 展示连接信息、可编辑数据库文件/服务器、初始化建表、测试连接、浏览表与行数。
  11. /// 未在 [DatabaseProvider] 上指定 ConfigPageType 的提供者都用本页;提供者专属字段由其自己的页扩展。
  12. /// 操作类通知复用主程序 DialogHelper;页面不本地合并 HC 皮肤,颜色走 DynamicResource 跟随主题。
  13. /// </summary>
  14. public partial class DefaultDatabaseConfigPage : UserControl, IDatabaseConfigPage
  15. {
  16. private static readonly Brush ConnectedBrush = Freeze(0x4C, 0xAF, 0x50); // 绿=已连接
  17. private static readonly Brush IdleBrush = Freeze(0x9E, 0x9E, 0x9E); // 灰=未连接
  18. private ProductDatabase _db;
  19. public DefaultDatabaseConfigPage()
  20. {
  21. InitializeComponent();
  22. }
  23. /// <summary>当前绑定的产品数据库实例。</summary>
  24. public ProductDatabase Database => _db;
  25. public void BindDatabase(ProductDatabase database)
  26. {
  27. _db = database;
  28. bool has = _db != null;
  29. BtnInit.IsEnabled = has;
  30. BtnTest.IsEnabled = has;
  31. BtnSave.IsEnabled = has;
  32. RefreshHeader();
  33. RefreshTables();
  34. }
  35. public void UnbindDatabase()
  36. {
  37. _db = null;
  38. TxtProduct.Text = "-";
  39. TxtProvider.Text = "-";
  40. TxtServer.Text = "";
  41. TxtStatus.Text = "未绑定";
  42. StatusDot.Background = IdleBrush;
  43. TableList.Items.Clear();
  44. }
  45. private void RefreshHeader()
  46. {
  47. if (_db == null) { UnbindDatabase(); return; }
  48. TxtProduct.Text = string.IsNullOrEmpty(_db.ProductName) ? "-" : _db.ProductName;
  49. TxtProvider.Text = (_db.Config?.ProviderType ?? "sqlite").ToUpperInvariant();
  50. TxtServer.Text = _db.Config?.Server ?? "";
  51. bool connected = _db.IsConnected;
  52. TxtStatus.Text = connected ? "已连接" : "未连接";
  53. StatusDot.Background = connected ? ConnectedBrush : IdleBrush;
  54. }
  55. private void RefreshTables()
  56. {
  57. TableList.Items.Clear();
  58. if (_db?.Database == null) return;
  59. if (!_db.IsConnected)
  60. {
  61. TableList.Items.Add("(未连接 — 点「初始化/建表」或「测试连接」)");
  62. return;
  63. }
  64. try
  65. {
  66. foreach (var name in _db.Database.GetTableNames())
  67. {
  68. long count = -1;
  69. try
  70. {
  71. var scalar = _db.Database.ExecuteScalar($"SELECT COUNT(*) FROM [{name}]");
  72. if (scalar != null && scalar != DBNull.Value)
  73. count = Convert.ToInt64(scalar);
  74. }
  75. catch { /* 单表计数失败不影响列表 */ }
  76. TableList.Items.Add(count >= 0 ? $"{name} ({count} 行)" : name);
  77. }
  78. }
  79. catch (Exception ex)
  80. {
  81. TableList.Items.Add($"读取表失败:{ex.Message}");
  82. }
  83. }
  84. private void BtnInit_Click(object sender, RoutedEventArgs e)
  85. {
  86. if (_db == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
  87. var r = _db.Initialize();
  88. RefreshHeader();
  89. RefreshTables();
  90. if (r.Success) DialogHelper.Success(r.Message);
  91. else DialogHelper.ShowError(r.Message);
  92. }
  93. private void BtnTest_Click(object sender, RoutedEventArgs e)
  94. {
  95. if (_db?.Database == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
  96. var r = _db.Database.TestConnection();
  97. RefreshHeader();
  98. if (r.Success) DialogHelper.Success(r.Message);
  99. else DialogHelper.ShowError(r.Message);
  100. }
  101. private void BtnRefresh_Click(object sender, RoutedEventArgs e)
  102. {
  103. RefreshHeader();
  104. RefreshTables();
  105. }
  106. private void BtnSave_Click(object sender, RoutedEventArgs e)
  107. {
  108. if (_db?.Config == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
  109. _db.Config.Server = TxtServer.Text?.Trim();
  110. if (ProductDatabaseManager.SaveConfig(_db.ProductName, _db.Config))
  111. {
  112. // 重建实例让新配置立即生效,并重新绑定本页
  113. BindDatabase(ProductDatabaseManager.Recreate(_db.ProductName));
  114. DialogHelper.Success("配置已保存并生效");
  115. }
  116. else
  117. {
  118. DialogHelper.ShowError("配置保存失败(详见日志)");
  119. }
  120. }
  121. private static Brush Freeze(byte r, byte g, byte b)
  122. {
  123. var brush = new SolidColorBrush(Color.FromRgb(r, g, b));
  124. brush.Freeze();
  125. return brush;
  126. }
  127. }
  128. }