# WnDataSource

> 数据源对象，用于与数据库进行交互。WnDataSource对象在调用模块主窗体的`Assemble`方法时装载，配置信息来源于`窗体界面设计`的数据源配置信息。

## 主要属性

WnDataSource主要有以下两个属性：

|属性|说明|
|-|-|
|KeyValues|类型为Hashtable，关键字集合，用于替换数据集中的关键字|
|DataSets|类型为Hashtable，存储获取到的DataSet对象|

> KeyValues中数据的来源
> - 可以在写代码的时候通过`wnDataSource.KeyValues["xxx"]=xxx`的方式赋值
> - 通过方法参数传递的关键字也会添加到KeyValues中

## 主要方法 

 WnDataSource主要有以下几个方法：
 ```csharp
 public Hashtable GetDataSet(Hashtable ht);

 public Hashtable ExecSql(Hashtable ht);

 public Hashtable UpdateDataSet(Hashtable ht);

 public Hashtable RemoveDataSet(Hashtable ht);
 ```

### GetDataSet

> 该方法是执行select语句，从数据库获取数据。获取的数据以DataSet的形式保存在DataSets属性中。

**方法参数**

参数是一个Hashtable，主要包含以下固定项：

|键|是否必须|说明|
|-|-|-|
|DataSetName|必须|数据集名称，程序将根据该名称获取要执行的SQL语句|
|FacadeAlias|非必须|应用层别名，配置后将会到指定的应用层获取数据|
|TableNames|非必须|获取数据集的所有表可以不传；获取一个表的数据传递对应表名即可；获取多个表则传递对应表名的数组|

**返回值**

返回值是一个Hashtable，主要包含以下项
|键|说明|
|-|-|
|IsSuccess|数据集执行是否成功，“1”表示成功，“0”表示失败|

### ExecSql

> 该方法通过执行update和delete语句来与数据库进行交互。

**方法参数**

参数是一个Hashtable，主要包含以下固定项：

|键|是否必须|说明|
|-|-|-|
|DataSetName|必须|数据集名称，程序将根据该名称获取要执行的SQL语句|
|FacadeAlias|非必须|应用层别名，配置后将会到指定的应用层执行SQL语句|

**返回值**

返回值是一个Hashtable，主要包含以下项
|键|说明|
|-|-|
|IsSuccess|数据集执行是否成功，“1”表示成功，“0”表示失败|

### UpdateDataSet

> 通过DataSet更新数据库。

**方法参数**

参数是一个Hashtable，主要包含以下固定项：

|键|是否必须|说明|
|-|-|-|
|DataSetName|必须|数据集名称，程序将根据该名称获取要保存的DataSet|
|FacadeAlias|非必须|应用层别名，配置后将会到指定的应用层保存数据|
|TableNames|非必须|保存数据集的所有表可以不传；保存一个表的数据传递对应表名；保存多个表则传递对应表名的数组|
|BeforeDataSetName|非必须|用于获取保存DataSet数据前要执行的SQL语句|
|AfterDataSetName|非必须|用于获取保存DataSet数据后要执行的SQL语句|
|ActionStep|必须|用于指明本次更新方法要执行哪些动作|

**ActionStep**

> `ActionStep`是一个`List<Act>`的泛型，`Act`是我们自己封装的一个枚举类型，包含多个动作。

Act主要包含以下动作：

|动作|说明|
|-|-|
|CommitEdit|提交数据，将调用与DataSet中DataTable通信的WnGrid对象的CommitEdit方法|
|AskIsUpdate|询问是否保存，如果有数据修改则提示询问是否保存，根据选择将对返回结果的`IsUpdate`赋值|
|HandleData|排序，给`是否顺序列`为1的列赋值|
|CheckData|检查必录项是否为空|
|SaveData|保存数据|
|ShowSuccess|提示成功，现基本上不用|

**返回值**

返回值是一个Hashtable，主要包含以下项
|键|说明|
|-|-|
|IsSuccess|数据集执行是否成功，“1”表示成功，“0”表示失败|
|IsChanged|数据是否发生修改，“0”表示没修改，“1”表示修改|
|IsUpdate|数据是否保存，“-1”表示取消，此时IsSuccess设为“1”，“0”表示不保存，此时IsSuccess设为“1”，“1”表示保存|
|IsEmpty|是否有必录项为空，“0”表示没有，“1”表示有|
|EmptyDataSetName|必录项为空的数据集的名称|
|EmptyTableName|必录项为空的表名|
|EmptyColumnName|必录项为空的列名|

### RemoveDataSet

> 该方法是从DataSets对象中把指定的表设为null。如果存在表间关系，则应提前把表间关系给移除掉。

**方法参数**

参数是一个Hashtable，主要包含以下固定项：

|键|是否必须|说明|
|-|-|-|
|DataSetName|必须|数据集名称，是DataSets对象的键|
|FacadeAlias|非必须|应用层别名，如果配置将与DataSetName拼接作为DataSets对象的键|
|TableNames|非必须|要设置为null的表名，不传则整个DataSet所有的表都设置为null|

**返回值**

返回值是一个Hashtable，主要包含以下项
|键|说明|
|-|-|
|IsSuccess|执行是否成功，“1”表示成功，“0”表示失败|