首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于 WPF + SqlSugar 框架实现 MySQL 和 SQLite 数据库表界面显示及 CRUD 功

基于 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),结合依赖注入提升可维护性。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OLzHYO8ge8YVffzHe1iGgQVw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券