# 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();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://monksoul.gitbook.io/hoa/shujukucaozuoshinan/datasetdatatablecaozuo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
