基于 WPF + SqlSugar 框架实现 MySQL 和 SQLite 数据库表界面显示及 CRUD 功能的完整方案,结合两种数据库的异同点进行技术实现分析:
一、数据库配置与连接
1. MySQL 连接配置
csharp
// 使用 SqlSugarClient 统一管理
var mysqlConn = new SqlSugarClient(new ConnectionConfig{
ConnectionString = "server=localhost;port=3306;uid=root;pwd=123456;database=testdb",
DbType = DbType.MySql,
IsAutoCloseConnection = true
});
关键点:需安装 `MySql.Data` NuGet 包,端口默认 3306,支持事务和存储过程^6^7。
2. SQLite 连接配置
csharp
var sqliteConn = new SqlSugarClient(new ConnectionConfig{
ConnectionString = "Data Source=DB\\data.db;Version=3;Pooling=False;",
DbType = DbType.Sqlite,
IsAutoCloseConnection = true
});
注意:需指定 `Version=3` 并控制连接池,避免 macOS/Linux 环境路径问题^5^10。
---
二、界面设计与数据绑定
1. DataGrid 动态列生成(支持多表)
xml
<DataGrid x:Name="dgData" AutoGenerateColumns="False"
ItemsSource="{Binding DataList}" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="80"/>
<DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="*"/>
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="编辑" Command="{Binding EditCommand}"/>
<Button Content="删除" Command="{Binding DeleteCommand}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
优化技巧:通过 `VirtualizingStackPanel` 提升大数据量性能,设置 `AutoGenerateColumns="False"` 避免列混乱^4^9。
2. MVVM 模式实现
csharp
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<Employee> _dataList;
public ObservableCollection<Employee> DataList
{
get => _dataList;
set { _dataList = value; OnPropertyChanged(); }
}
// 通过 SqlSugar 查询数据
public void LoadData()
{
DataList = new ObservableCollection<Employee>(
sqliteConn.Queryable<Employee>().ToList()
);
}
}
优势:解耦界面与业务逻辑,支持双向绑定^6^10。
---
三、CRUD 功能实现
1. 通用操作封装
csharp
public class BaseService<T> where T : class, new()
{
// 新增
public bool Insert(T entity)
{
return db.Insertable(entity).ExecuteCommand() > 0;
}
// 分页查询
public List<T> GetPageList(int pageIndex, int pageSize)
{
return db.Queryable<T>().ToPageList(pageIndex, pageSize);
}
// 事务处理
public void TransactionDemo()
{
db.Ado.BeginTran();
try {
db.Insertable(entity1).ExecuteCommand();
db.Updateable(entity2).ExecuteCommand();
db.Ado.CommitTran();
} catch {
db.Ado.RollbackTran();
}
}
}
特性:支持批量操作、Lambda 表达式查询、跨数据库兼容^5^6。
2. 差异处理
功能 MySQL 方案 SQLite 方案
自增主键 `SugarColumn(IsIdentity=true)` `SugarColumn(IsPrimaryKey=true)`
日期函数 `NOW()` `DATETIME('now')`
批量插入 使用 `BulkCopy` 事务包裹普通插入
---
四、高级功能扩展
1. 数据库迁移同步
- 使用 `db.DbFirst.CreateClassFile` 生成实体类
- 通过 SQLyog 实现表结构同步(MySQL)^1
- SQLite 使用 `db.CodeFirst.InitTables` 自动建表^10
2. 性能优化
- 启用二级缓存:`db.Queryable<T>().WithCache()`
- 异步操作:`await db.Queryable<T>().ToListAsync()`
- 避免 N+1 查询:使用 `Includes` 预加载关联数据^6
3. 安全防护
- 参数化查询防止 SQL 注入
- 连接字符串加密存储
- 使用 `SugarColumn(IsIgnore=true)` 隐藏敏感字段
---
五、调试与异常处理
1. 常见问题
- 连接超时:检查防火墙设置,增加 `ConnectionTimeout=30`
- 编码乱码:MySQL 设置 `charset=utf8mb4`,SQLite 配置 `PRAGMA encoding='UTF-8'`
- 跨平台路径:使用 `Environment.CurrentDirectory` 动态获取路径^5
2. 诊断工具
- 输出 SQL 日志:`db.Aop.OnLogExecuting = sql => Debug.WriteLine(sql)`
- 使用 EF Core Profiler 分析执行计划
---
源码参考示例
csharp
// 动态切换数据库
public void SwitchDb(DbType dbType)
{
var connStr = dbType == DbType.MySql ? mysqlConnStr : sqliteConnStr;
db = new SqlSugarClient(new ConnectionConfig{
ConnectionString = connStr,
DbType = dbType
});
}
// 组合查询
var list = db.Queryable<Employee>()
.WhereIF(!string.IsNullOrEmpty(name), e => e.Name.Contains(name))
.OrderBy(e => e.Id, OrderByType.Desc)
.Select(e => new { e.Id, e.Name })
.ToList();
扩展建议**:对于复杂业务场景,可参考仓储模式实现分层架构(如文献10),结合依赖注入提升可维护性。
领取专属 10元无门槛券
私享最新 技术干货