# 9.6、DataSet、DataTable 操作

Hoa Framework 框架中已经集成了 `DataSet` 和 `DataTable` 的支持，支持 `Sql` 和 `存储过程` 两种方式。

**在Hoa Framework v1.4.0 版本新增了 切面上下文功能，也就是下面的代码不再推荐使用，见** [**9.12、切面上下文（TangentDbContext）**](https://monksoul.gitbook.io/hoa/shujukucaozuoshinan/qiemianshagnxiawen)**章节。**

## DataSet

### 纯 `sql` 查询并返回 `DataSet`(不推荐)

```csharp
var dataSet = _testRepository.SqlDataSetQuery(@"
    select * from A;
    select * from B;
    select * from C;
", params);
```

### 存储过程执行返回 `DataSet`(不推荐)

```csharp
var dataSet = _testRepository.SqlProcedureDataSetQuery("存储过程名", new PROCModel{});
```

### 将 `DataSet` 转换成 List 对象（推荐） :point\_left:&#x20;

**上面两种方式返回的是 `DataSet` 对象，还需要我们自己转换一次。**&#x20;

这里，Hoa Framework 提供了更方便的泛型操作方式，直接将多个表输出为对象方式。

#### :flag\_black: 纯 `sql` 返回多个表并将多个表转成对象

```csharp
// 纯 sql 方式
var data1 = _testRepository.SqlDataSetQuery<T1>(@"sqls...", params);
var (data1, data2) = _testRepository.SqlDataSetQuery<T1, T2>(@"sqls...", params);
var (data1, data2, data3) = _testRepository.SqlDataSetQuery<T1, T2, T3>(@"sqls...", params);
var (data1, data2, data3, data4) = _testRepository.SqlDataSetQuery<T1, T2, T3, T4>(@"sqls...", params);
var (data1, data2, data3, data4, data5) = _testRepository.SqlDataSetQuery<T1, T2, T3, T4, T5>(@"sqls...", params);
var (data1, data2, data3, data4, data5, data6) = _testRepository.SqlDataSetQuery<T1, T2, T3, T4, T5, T6>(@"sqls...", params);
var (data1, data2, data3, data4, data5, data6, data7) = _testRepository.SqlDataSetQuery<T1, T2, T3, T4, T5, T6, T7>(@"sqls...", params);
var (data1, data2, data3, data4, data5, data6, data7, data8) = _testRepository.SqlDataSetQuery<T1, T2, T3, T4, T5, T6, T7, T8>(@"sqls...", params);
```

#### :flag\_black: 存储过程 返回多个表并将多个表转成对象

```csharp
// 存储过程方式
var data1 = _testRepository.SqlProcedureDataSetQuery<T1>("存储过程名", new PROCModel{});
var (data1, data2) = _testRepository.SqlProcedureDataSetQuery<T1, T2>("存储过程名", new PROCModel{});
var (data1, data2, data3) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3>("存储过程名", new PROCModel{});
var (data1, data2, data3, data4) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3, T4>("存储过程名", new PROCModel{});
var (data1, data2, data3, data4, data5) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3, T4, T5>("存储过程名", new PROCModel{});
var (data1, data2, data3, data4, data5, data6) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3, T4, T5, T6>("存储过程名", new PROCModel{});
var (data1, data2, data3, data4, data5, data6, data7) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3, T4, T5, T6, T7>("存储过程名", new PROCModel{});
var (data1, data2, data3, data4, data5, data6, data7, data8) = _testRepository.SqlProcedureDataSetQuery<T1, T2, T3, T4, T5, T6, T7, T8>("存储过程名", new PROCModel{});
```

## DataTable

### 纯 `sql` 查询并返回 `DataTable`(不推荐)

```csharp
var dataTable = _testRepository.SqlQuery(@"select * from A", params);
```

### 存储过程执行返回 `DataTable`(不推荐)

```csharp
var dataTable = _testRepository.SqlProcedureQuery("存储过程名", new PROCModel{});
```

### 将 `DataTable` 转成 `List<T>`(推荐) :point\_left:&#x20;

```csharp
var list = _testRepository.SqlQuery<A>(@"select * from A", params);
```

## 对象转 `SqlParameters`

```csharp
// 支持匿名类
var procModel = new { Name = "Monk", Age = 27 };
var sqlParameters = procModel.ToSqlParameters();

// 支持强类型
var procModel = new PROCModel{ Name = "Monk", Age = 27 };
var sqlParameters = procModel.ToSqlParameters();
```
