using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using TeamAAS.Database.Services; namespace TeamAAS.Database.UI { /// /// 默认数据库「配置/调试页」(对齐 Camera 的 DefaultCameraDebugPage):绑定「当前产品」的 ProductDatabase, /// 展示连接信息、可编辑数据库文件/服务器、初始化建表、测试连接、浏览表与行数。 /// 未在 [DatabaseProvider] 上指定 ConfigPageType 的提供者都用本页;提供者专属字段由其自己的页扩展。 /// 操作类通知复用主程序 DialogHelper;页面不本地合并 HC 皮肤,颜色走 DynamicResource 跟随主题。 /// public partial class DefaultDatabaseConfigPage : UserControl, IDatabaseConfigPage { private static readonly Brush ConnectedBrush = Freeze(0x4C, 0xAF, 0x50); // 绿=已连接 private static readonly Brush IdleBrush = Freeze(0x9E, 0x9E, 0x9E); // 灰=未连接 private ProductDatabase _db; public DefaultDatabaseConfigPage() { InitializeComponent(); } /// 当前绑定的产品数据库实例。 public ProductDatabase Database => _db; public void BindDatabase(ProductDatabase database) { _db = database; bool has = _db != null; BtnInit.IsEnabled = has; BtnTest.IsEnabled = has; BtnSave.IsEnabled = has; RefreshHeader(); RefreshTables(); } public void UnbindDatabase() { _db = null; TxtProduct.Text = "-"; TxtProvider.Text = "-"; TxtServer.Text = ""; TxtStatus.Text = "未绑定"; StatusDot.Background = IdleBrush; TableList.Items.Clear(); } private void RefreshHeader() { if (_db == null) { UnbindDatabase(); return; } TxtProduct.Text = string.IsNullOrEmpty(_db.ProductName) ? "-" : _db.ProductName; TxtProvider.Text = (_db.Config?.ProviderType ?? "sqlite").ToUpperInvariant(); TxtServer.Text = _db.Config?.Server ?? ""; bool connected = _db.IsConnected; TxtStatus.Text = connected ? "已连接" : "未连接"; StatusDot.Background = connected ? ConnectedBrush : IdleBrush; } private void RefreshTables() { TableList.Items.Clear(); if (_db?.Database == null) return; if (!_db.IsConnected) { TableList.Items.Add("(未连接 — 点「初始化/建表」或「测试连接」)"); return; } try { foreach (var name in _db.Database.GetTableNames()) { long count = -1; try { var scalar = _db.Database.ExecuteScalar($"SELECT COUNT(*) FROM [{name}]"); if (scalar != null && scalar != DBNull.Value) count = Convert.ToInt64(scalar); } catch { /* 单表计数失败不影响列表 */ } TableList.Items.Add(count >= 0 ? $"{name} ({count} 行)" : name); } } catch (Exception ex) { TableList.Items.Add($"读取表失败:{ex.Message}"); } } private void BtnInit_Click(object sender, RoutedEventArgs e) { if (_db == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; } var r = _db.Initialize(); RefreshHeader(); RefreshTables(); if (r.Success) DialogHelper.Success(r.Message); else DialogHelper.ShowError(r.Message); } private void BtnTest_Click(object sender, RoutedEventArgs e) { if (_db?.Database == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; } var r = _db.Database.TestConnection(); RefreshHeader(); if (r.Success) DialogHelper.Success(r.Message); else DialogHelper.ShowError(r.Message); } private void BtnRefresh_Click(object sender, RoutedEventArgs e) { RefreshHeader(); RefreshTables(); } private void BtnSave_Click(object sender, RoutedEventArgs e) { if (_db?.Config == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; } _db.Config.Server = TxtServer.Text?.Trim(); if (ProductDatabaseManager.SaveConfig(_db.ProductName, _db.Config)) { // 重建实例让新配置立即生效,并重新绑定本页 BindDatabase(ProductDatabaseManager.Recreate(_db.ProductName)); DialogHelper.Success("配置已保存并生效"); } else { DialogHelper.ShowError("配置保存失败(详见日志)"); } } private static Brush Freeze(byte r, byte g, byte b) { var brush = new SolidColorBrush(Color.FromRgb(r, g, b)); brush.Freeze(); return brush; } } }