在现有代码的基础上,您可以添加一些使用 `DataSet` 的方法,作为 `LocalDataAccess` 类的 helper 方法。 `DataSet` 是一种适用于离线数据处理的对象,可以存储多个 `DataTable`,以及表之间的关系。下面是几个示例方法,展示如何使用 `DataSet`。
csharp
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Zhaoxi.BMS.Entity;
namespace Zhaoxi.BMS.DAL
{
public class LocalDataAccess
{
// 创建连接
SQLiteConnection conn = null;
// 准备操作对象
SQLiteCommand comm = null;
// 数据适配器
SQLiteDataAdapter adapter = null;
// 事务管理
SQLiteTransaction trans = null;
private void Dispose()
{
if (trans != null)
{
trans.Dispose();
trans = null;
}
if (adapter != null)
{
adapter.Dispose();
adapter = null;
}
if (comm != null)
{
comm.Dispose();
comm = null;
}
if (conn != null)
{
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
conn.Dispose();
conn = null;
}
}
private void Connection()
{
if (conn == null)
conn = new SQLiteConnection("data source=data.db");// Sqlite的连接字符串
// 其他数据库连接字符串不一样
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();
}
private DataTable GetData(string sql)
{
try
{
this.Connection();
adapter = new SQLiteDataAdapter(sql, conn);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
catch (Exception ex) { throw ex; }
finally
{
this.Dispose();
}
}
public DataTable GetBatteryGroup()
{
return GetData("select * from b_group");
}
public int SaveValues(List<ValueEntity> ves)
{
string sql = "insert into \"main\".\"values\"(value_name,value) values(\"{0}\",\"{1}\")";
this.Connection();
trans = conn.BeginTransaction();
int count = 0;
for (int i = 0; i < ves.Count; i++)
{
comm = new SQLiteCommand(string.Format(sql, ves[i].Name, ves[i].Value), conn);
count += comm.ExecuteNonQuery();
}
if (count == ves.Count)
{
trans.Commit();
}
else
{
trans.Rollback();
}
return count;
}
// 以下是与DataSet相关的Helper方法
// 获取多个表数据并存入DataSet
public DataSet GetMultipleTablesData()
{
DataSet ds = new DataSet();
try
{
this.Connection();
// 第一个表的数据
string sql1 = "select * from b_group";
adapter = new SQLiteDataAdapter(sql1, conn);
adapter.Fill(ds, "BatteryGroup");
// 第二个表的数据
string sql2 = "select * from values";
adapter = new SQLiteDataAdapter(sql2, conn);
adapter.Fill(ds, "Values");
return ds;
}
catch (Exception ex) { throw ex; }
finally
{
this.Dispose();
}
}
// 使用DataSet和DataAdapter更新数据库
public void UpdateValuesUsingDataSet(DataSet ds)
{
try
{
this.Connection();
string sql = "select * from values";
adapter = new SQLiteDataAdapter(sql, conn);
SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(adapter);
// 更新数据
adapter.Update(ds, "Values");
}
catch (Exception ex) { throw ex; }
finally
{
this.Dispose();
}
}
// 获取某个表的DataSet
public DataSet GetTableDataSet(string tableName)
{
DataSet ds = new DataSet();
try
{
this.Connection();
string sql = $"select * from {tableName}";
adapter = new SQLiteDataAdapter(sql, conn);
adapter.Fill(ds, tableName);
return ds;
}
catch (Exception ex) { throw ex; }
finally
{
this.Dispose();
}
}
}
}
### 说明
1. `GetMultipleTablesData` 方法:
- 这个方法从数据库中获取多个表的数据,并将其存储在一个 `DataSet` 对象中。每个表的数据保存在 `DataSet` 的不同 `DataTable` 中。
2. `UpdateValuesUsingDataSet` 方法:
- 这个方法演示了如何使用 `DataSet` 和 `DataAdapter` 更新数据库的数据。该方法使用 `SQLiteCommandBuilder` 自动生成 `INSERT`、`UPDATE` 和 `DELETE` 命令,并将 `DataSet` 中的更改提交到数据库。
3. `GetTableDataSet` 方法:
- 这个方法从数据库中获取指定表的数据,并将其存储在一个 `DataSet` 对象中。此方法便于获取单个表的数据并进行离线操作。
这些方法展示了如何使用 `DataSet` 和 `DataAdapter` 在离线模式下处理数据,这对于某些需要批量处理数据的场景非常有用。