diff --git a/source/_posts/C# DataTable.md b/source/_posts/C# DataTable.md new file mode 100644 index 0000000..f2977db --- /dev/null +++ b/source/_posts/C# DataTable.md @@ -0,0 +1,115 @@ +--- +title: C# DataTable +date: 2021-03-23 10:30:31 +author: 文永达 +top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg +--- + +# C# DataTable + +## 基础概念 + +表示一个内存内关系数据的表,如同关系型数据库中的表 + +## 创建 DataTable + +```c# +//引用命名空间 +using System.Data; +//创建一个空表, +DataTable dt = new DataTable(); +//创建一个名为"Table_New"的空表 +DataTable dt = new DataTable("Table_New"); + +``` + +## 列 DataColumn + +- DataColumn 定义每列的数据类型来确定表的架构 +- DataTable中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值 +- DataColumn的DataType属性,可限制该列的数据类型为整数、字符串或十进制数等,但必须将数据类型与数据源中的数据类型匹配。 + +```shell +//1.创建空列 +DataColumn dc = new DataColumn(); +dt.Columns.Add(dc); +//2. 提供列名,并对列属性进行设置 +DataTable workTable = new DataTable("Customers"); +//带列名和类型名 +DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32)); +// 对进行属性设置 +workCol.AllowDBNull = false; //列的属性设置为不允许 DBNull 值 +workCol.Unique = true; //值约束为唯一 +workColumn.AutoIncrement = true; //在表中添加新行时自动递增 +workColumn.AutoIncrementSeed = 200; //从值 200 开始并以 3 为增量递增的列 +workColumn.AutoIncrementStep = 3; +column.DefaultValue = 25; +// 定义主键:唯一地标识表中的每一行 +workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustID"]}; +// Or +DataColumn[] columns = new DataColumn[1]; +columns[0] = workTable.Columns["CustID"]; +workTable.PrimaryKey = columns; + +// 创建表达式列:能够包含根据 同一行 中其他列值或根据表中 多行 的列值计算而得的值 +//比如 表达式类型 示例 +// 比较 “总计 >= 500” +// 计算 "UnitPrice * Quantity" +// 聚合 Sum(Price) +workTable.Columns.Add("Total", typeof(Double)); +workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086"); + +``` + +## 复制DataTable + +```c# + objectTable = sourceTable .Copy();//深复制,包含DataRow + objectTable = sourceTable .Clone();//浅复制,只复制架构 +``` + +## 复制 DataRow + +### ImportDataRow方法 + +```c# +public void ImportDataRow( DataRow DataRow); + +objectTable = sourceTable.clone();//必须先复制表的架构,使具有相同的的列或关系! +foreach (DataRow oRow in sourceTable) +{ + objectTable.ImportDataRow(oRow);//在objectTable中添加一个新行,并将sourceRow的值复制进去,要求表的结构一样! +} +``` + +### 自定义复制 + +```c# +objectTable.Columns.Add ("id");//不需要有一样的架构,只复制自己需要的列! +Object[] myArry = new Object[1]; +foreach (DataRow oRow in sourceTable.Rows) +{ + tempRow = objectTable.NewRow();//此方法必须调用! + myArry[0] = oRow["id"];//如果myArry中没有源表中的id列的话就会报错! + tempRow.ItemArray = myArry;//ItemArray属性为Object类型数组,根据程序的需要需要可自行复制多个列的数据! + objectTable.Rows.Add(tempRow); //此方法必须调用,否则DataRow中的数据将不能显示! +} +``` + +### LoadDataRow方法 + +```c# +public DataRow LoadDataRow(Object[] values,bool fAcceptChanges); + +Object[] newRow = new Object[3]; +// 设置对象数组的值 +newRow[0] = "Hello"; +newRow[1] = "World"; +newRow[2] = "two"; +DataRow myRow; +ObjectTable.BeginLoadData(); +// 将新行添加到表中 +myRow = ObjectTable.LoadDataRow(newRow, true);//标志要设置为true,表示添加新行 +ObjectTable.EndLoadData(); +``` + diff --git a/source/_posts/C#反射.md b/source/_posts/C#反射.md index 6ecd90a..06b2aec 100644 --- a/source/_posts/C#反射.md +++ b/source/_posts/C#反射.md @@ -12,4 +12,3 @@ ### Property.GetValue(from, null).Equals("NAME") -# C# DataTable \ No newline at end of file diff --git a/source/_posts/设计模式.md b/source/_posts/设计模式.md new file mode 100644 index 0000000..d3c8adc --- /dev/null +++ b/source/_posts/设计模式.md @@ -0,0 +1,82 @@ +--- +title: 设计模式 +date: 2023-01-03 10:11:47 +author: 文永达 +--- + +# 设计模式 + +## 工厂模式 + +### 概述 + +该模式用来封装和管理类的创建,终极目的是为了解耦,实现创建者和调用者的分离。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 + +工厂模式可以细分为三种: + +**简单工厂模式** + +**工厂方法模式** + +**抽象工厂模式** + +### 传统模式 + +创建不同种类的pizza对象 + +```java + Pizza orderPizza(String type) { + Pizza pizza; + if(type.equals("chess"){ + pizza = new ChessPizza(); + }else if(type.equals("greek"){ + pizza = new GreekPizza(); + }else if(type.equals("apple"){ + pizza = new ApplePizza(); + } + .... + //准备材料 + pizza.prepare(); + //烘烤 + pizza.bake(); + //切 + pizza.cut(); + //装盒 + pizza.box(); + return pizza; + } +``` + + + +### 简单工厂模式 + +在传统模式中直接让调用者去创建对象。但是,假如创建对象的过程比较复杂,我们可以将其交由一个新的类来创建,这种类叫工厂类,调用者只需要调用这个类的函数来创建对象就行了,无需再书写创建对象。 + +```java +public class SimpleFactory { + + public static Pizza createPizza(String pizzaType){ + Pizza pizza = null; + System.out.println("使用了简单工厂模式"); + if (pizzaType.equals("greek")) { + pizza = new GreekPizza(); + pizza.setName("greek"); + } else if (pizzaType.equals("chess")) { + pizza = new ChessPizza(); + pizza.setName("chess"); + } else if (pizzaType.equals("pepper")) {//新增PepperPizza的时候 修改了源代码 违反了ocp原则 如果新增10000个? + //那就很麻烦了 + pizza = new PepperPizza(); + pizza.setName("pepper"); + } + + return pizza; + } +} +``` + + + +### +