进行存款和储蓄进度再次来到游标集合转换到List,全面梳理

By admin in 4858.com on 2019年4月8日

近些年相比较忙,好久没写博客了。个人感觉最佳的迈入正是写东西。哈哈。

近期比较忙,好久没写博客了。个人感觉最棒的提升正是写东西。哈哈。

  近期在类型中央银行使了Entity Framework
四.一,语句查询全体都以用Linq和Lambda表明式达成,不过有多少个页面查询比较复杂,用到了四个标准化汇总和列值的论断,假设用Linq来写语句突出复杂,还未必能兑现想要的结果,最后只可以选用Oracle的贮存进程来形成,因为急需传入参数执行查询重回结果集。

转自:

一般我们运用ADO.net从数据库中读取数据再次回到的集合是DataSet类型的。有时候大家需求进行转换来List<T>集合。壹般的做法是在DAL层中,写个形式实行转移。(每一个表写一个)。累哦!~

相似我们利用ADO.net从数据库中读取数据再次来到的集纳是DataSet类型的。有时候大家供给开始展览转换到List<T>集合。一般的做法是在DAL层中,写个格局开始展览更换。(每一种表写八个)。累哦!~

  在行使EF调用执行存款和储蓄进程获得游标集合,试验讨论了几天也不许落到实处,最后只得选用.Net的客户端驱动或然奥莱Db连接Oracle实现存款和储蓄进程的调用,最终收获到的聚合也只可以是DataSet也许DataTable,还非得要转换到实体对象List<>。

目录:

于是本人就想,能否写个厂子,传入DataSet 集合 和
要求中间转播的类的种类。就活动转化了。就有了下边包车型大巴代码了。

故而本身就想,能还是不能够写个工厂,传入DataSet 集合 和
须要中转的类的档次。就活动转接了。就有了上边的代码了。

  存款和储蓄进程进行办法:

  1. 简易的介绍下ADO.NET
  2. SqlConnection(连接对象)
  3. SqlCommand(命令对象)
  4. SqlParameter(Sql参数)
  5. SqlDataReader(数据流读取器)
  6. SqlTransaction(事务)
  7. SqlDataAdapter(数据适配器)
  8. DataSet,DataTable,DataRow,DataColumn
  9. 包装数据库操作类(那才是精华) 

4858.com 14858.com 2

4858.com 34858.com 4

4858.com 54858.com 6View Code

一丶不难的介绍下ADO.NET

 1         /// <summary>
 2         ///  Dataset 集合根据传入的 类型。自动转换List集合"
 3         /// </summary>
 4         /// <typeparam name="T">类(属性类 modle)</typeparam>
 5         /// <param name="ds">数据集合</param>
 6         /// <returns>List集合</returns>
 7         public List<T> GetListbyDataSet<T>(DataSet ds) where T: new()
 8         {
 9             List<T> li = new List<T>(); //声明要返回的集合
10             var s = typeof(T);          // 获取传入类型
11             var str = s.GetProperties(); // 获取传入类型的属性集合
12             if (ds.Tables[0] == null || ds.Tables[0].Rows.Count < 0) //判断ds的null和是否包含数据
13             {
14                 return li;
15             }
16             for (int i = 0; i < ds.Tables[0].Rows.Count; i++) //循环集合准备获取数据
17             {
18                 T t1 = new T();       // 声明类
19                 foreach (var item in str)  // 循环类的属性
20                 {
21                     string itemstr = item.Name; //类属性名称
22                     var itemtype = item.PropertyType; // 类属性的类型(int string datetime)
23                     object value = GetvalbyDataSet(itemstr, itemtype, ds.Tables[0].Rows[i]); //获取值
24                     item.SetValue(t1, value, null);
25                     
26                 }
27                 li.Add(t1);
28             }
29              return li;
30         }
 1         /// <summary>
 2         ///  Dataset 集合根据传入的 类型。自动转换List集合"
 3         /// </summary>
 4         /// <typeparam name="T">类(属性类 modle)</typeparam>
 5         /// <param name="ds">数据集合</param>
 6         /// <returns>List集合</returns>
 7         public List<T> GetListbyDataSet<T>(DataSet ds) where T: new()
 8         {
 9             List<T> li = new List<T>(); //声明要返回的集合
10             var s = typeof(T);          // 获取传入类型
11             var str = s.GetProperties(); // 获取传入类型的属性集合
12             if (ds.Tables[0] == null || ds.Tables[0].Rows.Count < 0) //判断ds的null和是否包含数据
13             {
14                 return li;
15             }
16             for (int i = 0; i < ds.Tables[0].Rows.Count; i++) //循环集合准备获取数据
17             {
18                 T t1 = new T();       // 声明类
19                 foreach (var item in str)  // 循环类的属性
20                 {
21                     string itemstr = item.Name; //类属性名称
22                     var itemtype = item.PropertyType; // 类属性的类型(int string datetime)
23                     object value = GetvalbyDataSet(itemstr, itemtype, ds.Tables[0].Rows[i]); //获取值
24                     item.SetValue(t1, value, null);
25                     
26                 }
27                 li.Add(t1);
28             }
29              return li;
30         }
 1 /// <summary>  
 2         /// 执行存储过程  
 3         /// </summary>  
 4         /// <param name="storedProcName">存储过程名</param>  
 5         /// <param name="parameters">存储过程参数</param>  
 6         /// <param name="tableName">DataSet结果中的表名</param>  
 7         /// <returns>DataSet</returns>  
 8         public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
 9         {
10             using (OracleConnection connection = new OracleConnection(connectionString))
11             {
12                 DataSet dataSet = new DataSet();
13                 connection.Open();
14                 OracleDataAdapter sqlDA = new OracleDataAdapter();
15                 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
16                 sqlDA.Fill(dataSet, tableName);
17                 connection.Close();
18                 return dataSet;
19             }
20         }

   领悟System.Data命名空间下大家常用的壹些类:

View Code

View Code

  DataTable转换List方法:

4858.com 7

4858.com 84858.com 9

4858.com 104858.com 11

4858.com 124858.com 13View Code

 1 ①System.Data  → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping
 2 ②System.Data.Coummon     → 各种数据访问类的基类和接口
 3 ③System.Data.SqlClient   → 对Sql Server进行操作的数据访问类
 4   主要有:   a) SqlConnection            → 数据库连接器
 5             b) SqlCommand               → 数据库命名对象
 6             c) SqlCommandBuilder        → 生存SQL命令
 7             d) SqlDataReader            → 数据读取器
 8             e) SqlDataAdapter           → 数据适配器,填充DataSet
 9             f) SqlParameter             → 为存储过程定义参数
10             g) SqlTransaction           → 数据库事物
 1  /// <summary>
 2         ///  在DataRow中 获取 对应列的值
 3         /// </summary>
 4         /// <param name="colname">列名称</param>
 5         /// <param name="colname">列的类型</param>
 6         /// <param name="dr">DataRow 集合</param>
 7         /// <returns>列值</returns>
 8         private object GetvalbyDataSet(string colname,Type coltype, DataRow dr)
 9         {
10             if (dr.Table.Columns.Contains(colname))
11             {
12                 if (typeof(int) == coltype)
13                 {
14                     return dr[colname] == null ? 0 : int.Parse(dr[colname].ToString());
15                 }
16                 if (typeof(DateTime) == coltype)
17                 {
18                     return dr[colname] == null ? DateTime.Parse("2016/9/22") : DateTime.Parse(dr[colname].ToString());
19                 }
20                 if (typeof(decimal) == coltype)
21                 {
22                     return dr[colname] == null ? decimal.Parse("0") : decimal.Parse(dr[colname].ToString());
23                 }
24                 string str = dr[colname] == null ? "" :  dr[colname].ToString();
25                 return str;
26             }
27             else
28             {
29                 return "";
30             }
31         }
 1  /// <summary>
 2         ///  在DataRow中 获取 对应列的值
 3         /// </summary>
 4         /// <param name="colname">列名称</param>
 5         /// <param name="colname">列的类型</param>
 6         /// <param name="dr">DataRow 集合</param>
 7         /// <returns>列值</returns>
 8         private object GetvalbyDataSet(string colname,Type coltype, DataRow dr)
 9         {
10             if (dr.Table.Columns.Contains(colname))
11             {
12                 if (typeof(int) == coltype)
13                 {
14                     return dr[colname] == null ? 0 : int.Parse(dr[colname].ToString());
15                 }
16                 if (typeof(DateTime) == coltype)
17                 {
18                     return dr[colname] == null ? DateTime.Parse("2016/9/22") : DateTime.Parse(dr[colname].ToString());
19                 }
20                 if (typeof(decimal) == coltype)
21                 {
22                     return dr[colname] == null ? decimal.Parse("0") : decimal.Parse(dr[colname].ToString());
23                 }
24                 string str = dr[colname] == null ? "" :  dr[colname].ToString();
25                 return str;
26             }
27             else
28             {
29                 return "";
30             }
31         }
 1 class ConvertHelper<T> where T : new()  
 2     {  
 3         /// <summary>  
 4         /// 利用反射和泛型  
 5         /// </summary>  
 6         /// <param name="dt"></param>  
 7         /// <returns></returns>  
 8         public static List<T> ConvertToList(DataTable dt)  
 9         {  
10   
11             // 定义集合  
12             List<T> ts = new List<T>();  
13   
14             // 获得此模型的类型  
15             Type type = typeof(T);  
16             //定义一个临时变量  
17             string tempName = string.Empty;  
18             //遍历DataTable中所有的数据行  
19             foreach (DataRow dr in dt.Rows)  
20             {  
21                 T t = new T();  
22                 // 获得此模型的公共属性  
23                 PropertyInfo[] propertys = t.GetType().GetProperties();  
24                 //遍历该对象的所有属性  
25                 foreach (PropertyInfo pi in propertys)  
26                 {  
27                     tempName = pi.Name;//将属性名称赋值给临时变量  
28                     //检查DataTable是否包含此列(列名==对象的属性名)    
29                     if (dt.Columns.Contains(tempName))  
30                     {  
31                         // 判断此属性是否有Setter  
32                         if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
33                         //取值  
34                         object value = dr[tempName];  
35                         //如果非空,则赋给对象的属性  
36                         if (value != DBNull.Value)  
37                             pi.SetValue(t, value, null);  
38                     }  
39                 }  
40                 //对象添加到泛型集合中  
41                 ts.Add(t);  
42             }  
43   
44             return ts;  
45   
46         }  
47     }  

4858.com 14

View Code

View Code

  调用存款和储蓄进度:

  

 

 

4858.com 154858.com 16进行存款和储蓄进度再次来到游标集合转换到List,全面梳理。View Code

二丶SqlConnection(连接对象)

 1 public List<V_TEST> selSum(string startDate,string endDate)
 2 {
 3     OracleParameter[] parms = {
 4                                   new OracleParameter("P_YBQJ_S",OracleType.VarChar,6),
 5                                   new OracleParameter("P_YBQJ_E",OracleType.VarChar,6),
 6                                   new OracleParameter("RESULT_CUR",OracleType.Cursor)
 7                               };
 8     parms[0].Value = startDate;
 9     parms[1].Value = endDate;
10     parms[2].Direction = ParameterDirection.Output;
11     DataSet DS = OraHelper.RunProcedure("PRO_LJHZ", parms, "DS");
12     List<V_TEST> list1 = ConvertHelper<V_TEST>.ConvertToList(DS.Tables[0]);
13     return list1;
14 }

  一.连接字符串

 

    基本语法:数据源(Data Source)+数据库名称(Initial
Catalog)+用户名(User ID)+密码(Password)(那种措施相比较安全)!

有未有高手知道EF调用存款和储蓄进程的不二等秘书籍,在此教导一下!

    推荐小说 :SQL Server
连接字符串和身份验证,你无法不理解的ADO.NET(3)
连接字符串,你小觑了吧?,SQL Server
二〇〇八连接字符串写法大全,连接字符串有很多的写法,最有限帮衬的写法能够借助“SqlConnectionStringBuilder”类,它提供了包含万象的连日字符串的质量,以至于收缩出错率(相关属性查MSDN),还有多数总是字符串都写在配置文件之中了!

欢迎各路好手在此留下脚印,共同钻探与享受~~~

  二.创办连接对象

 

4858.com 17View Code

  三.打开和倒闭连接对象(使用Using来关闭连接)

4858.com 18View Code

     关于连接池的作品:你不可能不精晓的ADO.NET(伍)
细说数据库连接池(写的还真不赖啊),顶…

 

 三丶SqlCommand(命令对象)

  1.实例化的时候私下认可开首化的八个性格

4858.com 19

  4858.com,2.开立命令对象

    使用连接对象的“CreateCommand()”方法创设命令对象,也能够运用new来实例化对象!

1 SqlCommand command = connection.CreateCommand(); //这种方式比较好,也可以自己实例化一个对象!

  叁.多少个主要性质

    一CommandText:获取或安装要对数据源执行的 Transact-SQL
语句、表名或存款和储蓄进程!

    贰CommandType:设置你执行的SQL语句是储存进程依旧T-SQL(是2个枚举)!

    4858.com 20

    叁Parameters:设置你T-SQL中你须要动用的参数(前边会讲到),是八个“SqlParametersCollection”类型,这一个个性很要紧,是您通过代码给SQL语句传递参数的途径,所以记住语法,记住一些接纳规则讲对编码有非常大的扶植!

  四.多少个重点的主意(相信大家明白的不能够再熟稔了)

    一ExecuteNonQuery:重临是潜移默化的行数(int),重要实施更新,添加,删除等操作!

    二ExecuteReader:执行SQL或存款和储蓄进程,重临的是SqlDataReader类型,首要用来查询!

      ★  那边留意那么些点子的重载 CommandBehaviour 枚举,成员如下:

    4858.com 21

1 command.ExecuteReader(CommandBehavior.CloseConnection); //在执行读取之后会自动关闭连接对象

     三ExecuteScalar:再次回到执行结果集中的率先行第1列,假诺没有数据,则赶回NULL!

     Note:因为或许会重临“Null”值,所以需求对结果开始展览判定,如下:

4858.com 22View Code

    ④CreateParameter:创建SqlParameter实例

1 SqlParameter para = cmd.CreateParameter() //此方法适合SQL语句中只有一个参数的情况!

     推荐文章:您无法不知道的ADO.NET(陆)
谈谈Command对象与数据检索

          您不能够不通晓的ADO.NET(7)
Wow!Command对象高级应用

 

四丶SqlParameter(Sql参数)

  一.多少个至关心珍贵要的属性    

        ParameterName:   设置参数名

        Value:              给参数设置值

    Size:                 设置参数字节最大尺寸(以字节为但为)

    SqlDbType:     参数在SQL中的类型  

4858.com 23View Code

  二.指令对象添加参数集合的三种艺术

    ①AddWithValue

    ②Add

    ③AddRange

    推荐小说:SqlParameter的成效与用法,代码如下:

4858.com 24

 1  using (SqlConnection connection = new SqlConnection(""))
 2  {
 3      SqlCommand command = connection.CreateCommand();
 4      command.CommandText = "";
 5 
 6      //可以使用这种方式添加多个参数,不过方式不够好
 7      command.Parameters.Add("@name", SqlDbType.NVarChar).Value = "yang"; //第一种方式
 8      command.Parameters.Add("@age", SqlDbType.Int).Value = 888;
 9      command.Parameters.Add("@address", SqlDbType.NVarChar, 100).Value = "Jiang Su";
10 
11      //这种方式直接给定参数名和参数就可以了,可操作性比较差
12      command.Parameters.AddWithValue("@name", "yang");
13      command.Parameters.AddWithValue("@age", 888).SqlDbType = SqlDbType.Int;
14      command.Parameters.AddWithValue("@address", "Jiang su").SqlDbType = SqlDbType.NVarChar;
15 
16      //直接使用参数集合添加你需要的参数,推荐这种写法
17      SqlParameter[] parameters = new SqlParameter[]
18      {
19          new SqlParameter("@name",SqlDbType.NVarChar,100){Value = "yang"},
20          new SqlParameter("@age",SqlDbType.Int,2){Value = 888},
21          new SqlParameter("@address",SqlDbType.NVarChar,20){Value = "Jiang Su"}, 
22      };
23      command.Parameters.AddRange(parameters);  //参数也可以是一个Array数组,如果采用数组参数代码的可读性和扩展性就不是那么好了
24 
25      //当我们把参数都添加好之后,会生成一个“SqlParameterCollection”集合类型,相当于参数的集合
26      //那么我们就可以对这些参数进行修改和移除了
27      //说穿了“SqlParameterCollection”内部其实是一个List<SqlParameter>的集合,只是它里面的复杂度比较高,考虑的很全面
28      command.Parameters[0].Value = "hot girl";
29      command.Parameters[0].Size = 200;
30  }

4858.com 25

  3.说说“SqlParameterCollection”,参数集合

     上边添加的“SqlParameter”参数都被添加到了“SqlParameterCollection”集合中去了,所以大家才可以对它举行读取和改动!

  四.定义适当的参数属性获取存款和储蓄进度的再次回到值(return)
→ Direction = ParameterDirection.Output

    代码如下:

4858.com 26View Code

 

5丶SqlDataReader(数据流读取器)

   说实话,假使单单知道怎么利用读取器,那是可怜好学的,如若深刻掌握,它在那之中的学识将会尤其的诱惑人,那么就以自家小菜的经验来说说把,各位不用见怪啊!

   一.为主用法

4858.com 27View Code

   二.常用艺术

    1GetOrdinal:获取钦赐列名的列序号(索引号),使用那么些主意能够把平常改变的列进行定位

1 int name = dr.GetOrdinal("name"); //通过列名来获取当前列的索引号,这样如果下次你列名顺序发生变化也没有关系

    二GetName:  获取列名,参数为钦定列名的体系号,再次来到string

1 string columnName = dr.GetName(name); //通过列名所处的索引号来获取列名名称 

    叁IsDBNull:判断当前读取的多寡是否为Null,重临类型为Bool     

1   dr.IsDBNull(coContactID) ? "NULL" : dr.GetInt32(coContactID).ToString() //相信大家都会使用的

     4NextResult:当查问为批处理查询时,使用这几个法子去读取下2个结出集,重临值为Bool,固然存在四个结果集,则为
true;不然为 false

1 //select * from Employee;select * from County,这样的话就可以采用这种方式
2 dr.NextResult(); //记住这个要放在while(dr.Read())之后,因为读取一个数据集之后才能读取下一个数据集 

    伍Read:读取数据

      读取数据最重要的方法,不说了!

  叁.常用属性

    1HasRow:判断是还是不是含有1行或多行,也正是判断有没有数量,重临类型为Bool

    二FieldCount:获取读取的列数,再次回到类型为Int

    叁IsClosed:判断读取的数据流是或不是关闭

      所以灵活运用上面包车型客车习性讲增强代码的可读性和健壮性,综合示范:

4858.com 28View Code 

    Note:当 SqlDataReader
关闭后,只可以调用 IsClosed 和 RecordsAffected
属性,借使调用别的措施或品质将会报错!

  四.品质深刻剖析

    读取数据的时候会有很各样写法,如
dr[0].ToString(),dr[“Name”].ToString(),dr.GetString(0),dr.GetSqlString(0)
等等的读取方式的写法,尽管大家去网上查资料就会很不难发现那两种写法存在着壹些异样!

    上边是读取数据质量的下结论:

4858.com 29

1     SqlDataReader读取方法:
2     1. DataReader     索引   + 基于 [序列号] → dr[0].ToString        | Index-based access
3     2. DataReader     索引   + 基于 [列名]  → dr["Name"].ToString     | 性能最差
4     3. Get            开头的 + 基于 [序列号] → dr.GetString(0)      | type-access
5     4. GetSql         开头的 + 基于 [序列号] → dr.GetSqlString(0)   | Provider-specific typed accessor
6     5. GetOrdinal()   通过列名获取这个列的序列号                      | 这个方法在提高性能上面有作用
7     6. 性能(4) --> (3) --> (1) --> (2)

4858.com 30

     Note:所以在对数据开始展览读取时要有针对性的行使部分属性高的办法,也不是说要追求质量,只是那是一种习惯,对于多数读取数据库的主意应用索引来读取无疑是最快,记住一句话,“当品质未有成为问题的时候,不要过分的去优化它”,高效而又赏心悦目的施用那几个方法,才是王道!

    推荐小说:SqlDataReader
提前结束的属性难点

    PS:小编那里的下结论其实是从前在园子看到一位写的,找了半个小时都没找到,若是有人看到过,发个链接给自家,作者补上!

  5.SqlDataReader和DataSet的讨论

    推荐作品:谈谈Asp.net网址优化一:SqlDataReader和DataSet的挑三拣肆

 

六丶SqlTransaction(事务)

   壹.代码中的事务    

    现在代码中基本使用存款和储蓄过程来决定作业的处理,通过代码实行支配工作也是大家学习ADO.NET的任务之1!

    事务是在连续对象之后创造,并把它跟命令对象开始展览关联,使用try…..Catch捕获至极,然后调用RollBack方法回滚事务!

    Commit:提交

    RollBack:回滚

4858.com 31View Code

  二.作业中的命名存款和储蓄点      

    一旦你定义了命名存款和储蓄点,只可以回滚命名存款和储蓄点之后的操作,那是假如状态而利用!

    那种情景是当你调用RollBack方法玉石俱焚载贰个命名存款和储蓄点的参数,如下代码所示:

4858.com 32

 1     using (SqlConnection conn = new SqlConnection(str))
 2     {
 3          conn.Open();
 4          SqlTransaction transaction = conn.BeginTransaction();
 5          SqlCommand cmd = conn.CreateCommand();
 6          cmd.CommandText = "";
 7          cmd.Transaction = transaction;
 8          //使用命名存储点
 9          transaction.Save("this is point");  //定义命名存储点,使用Save方法先保存存储点,定义回滚数据的开始位置
10                 
11          //这边是你要回滚的操作代码,TO DO...
12 
13          //把从命名存储点到这里的操作进行回滚
14          transaction.Rollback("this is point");  //回滚命名存储点              
15      }

4858.com 33

  三.SQL语句中的事务(SQL
Server中的事务实际上很复杂的)

4858.com 34

1 BEGIN TRANSACTION
2 
3     --你需要执行的更新,删除,插入的语句
4     
5 IF(@@ERROR > 0) //这是系统变量,存储你在执行更新,删除,插入操作时发生错误的记录编号
6     ROLLBACK
7 ELSE
8     COMMIT

4858.com 35

     推荐文章:浅谈SQL
SE奥迪Q3VE卡宴安徽中华工程企业作的ACID

          深深sql
server中的事务

  4.说说“TransactionScope”,让工作进一步的粗略 

4858.com 36

 1 using (TransactionScope transactionScope = new TransactionScope())
 2 {
 3     try
 4     {
 5         using (SqlConnection connection = new SqlConnection())
 6         {
 7             // TO DO
 8             //提交事务,如果有异常,他会自动回滚的
 9             transactionScope.Complete();
10         }
11     }
12     catch (Exception)
13     {
14         //捕获异常
15         throw;
16     }
17 }

4858.com 37

     推荐小说:C#综上所述揭秘——细说事务

 

7丶SqlDataAdapter(数据适配器)

  1.构造函数 

4858.com 38

1 四个重载:    
2   1. 无参
3   2. SqlDataAdapter(SqlCommand)  → 执行命令对象实例
4   3. SqlDataAdapter(String, SqlConnection) → ①只能指定查询语句 ②连接对象实例
5   4. SqlDataAdapter(String, ConnectionString) → 用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的一个新实例
6   Note:第四个重载就把连接对象和命令对象都包含进去了!

4858.com 39

  二.填充数据(Fill)

     最简便易行的填写数据 

4858.com 40

1 DataSet dataSet = new DataSet();
2 using (SqlConnection conn = new SqlConnection(""))
3 {
4     conn.Open();
5     SqlCommand command = conn.CreateCommand();
6     command.CommandText = "select name,age,address from MyInformation";
7     SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
8     dataAdapter.Fill(dataSet);  //填充数据
9 }

4858.com 41

   三.用到“SqlCommandBuilder”对数码举行增加和删除改查

     壹添加多少

4858.com 42

 1  using (SqlConnection conn = new SqlConnection(ConnectionString()))
 2  {
 3      conn.Open();
 4      //构建查询语句,也可以指定SqlCommand,其中变换的方法有很多
 5      SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn);
 6      DataSet ds = new DataSet();
 7      da.Fill(ds);
 8      //这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库
 9      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
10      //添加行,实例化一个行对象,注意是用NewRow来创建行
11      DataRow row = ds.Tables[0].NewRow();
12      row[0] = "Yang";
13      row[1] = "鬼头";
14      ds.Tables[0].Rows.Add(row);  //添加到表中
15      da.Update(ds);             //把DataSet中表和数据库进行对比,更新
16  }

4858.com 43

     2改动数据

4858.com 44

 1 using (SqlConnection conn = new SqlConnection(""))
 2 {
 3     SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
 4     DataSet ds = new DataSet();
 5     da.Fill(ds);
 6     //很重要的一句话
 7     SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
 8     ds.Tables[0].Rows[12][1] = ""; //修改数据
 9     da.Update(ds);
10     //调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据
11     //如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常
12     ds.AcceptChanges();  //这句话可以不写的
13 }

4858.com 45

     三刨除数据

4858.com 46

 1  using (SqlConnection conn = new SqlConnection(""))
 2  {
 3      SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
 4      DataSet ds = new DataSet();
 5      da.Fill(ds);
 6      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
 7      //删除数据
 8      ds.Tables[0].Rows[12].Delete();
 9      da.Update(ds);  //这边会隐式调用DataTable的AcceptChanges方法
10  }

4858.com 47

     Note(很要紧的注意点)
值得注意的是Update方法已经隐式帮小编调用了AcceptChanges,不及担心状态为转移删除数据会报错,微软一度帮我们都搞好了,其实背后正是做的Table.AcceptChanges()那件事,若是在形似的DataTable中会如何,提交自上次调用
AcceptChanges
以来对该行开始展览的持有变更,在调用那些格局之后,表中全体改变将会提交,全数行状态(RowState)状态都将变为Unchanged,在DataSet中作者将会聊起那个内容!

  肆.关于“SqlData艾达pter”中Fill方法的壹对谈论

    简单的写一下,MSDN上都有些,查一下就通晓了!

1 ★指定填充数据的数量,如:
2 //从第五行到第十行数据填充DataSet   
3 //上面的定义错了
4 //应该是从第六行开始,后面的十条记录
5 da.Fill(ds,5,10,”MyTable”) 

  

八丶DataSet,DataTable,DataRow,DataColumn

  代表数据存放在缓存中,DataSet里面能够分包三个DataTable,DataTable中有多少个DataColumn和多少个DataRow,包蕴对各样对DataTable的操作,以及对列和行的操作,在进展DataSet,DataTable进行操作的时候,应该先判断它们
是还是不是为Null,这是最基本的!

  1.DataTable,DataRow,DataColumn

    1创办自身的DataTable 

4858.com 48View Code

    贰行使对象集合开始化器简化代码,以及利用“DataColumnCollection”和“DataRowCollection”来操作已添加的行和列

    构造函数的访问修饰符为Internal,通过那四个汇聚可以对Column和Row举办“增,删,改,查”,详细见MSDN,如Remove,Add,RemoveAt
etc!

4858.com 49

 1 dt.Columns.Add(new DataColumn("Age", typeof(Int32)));
 2 dt.Columns.Add(new DataColumn()
 3 {
 4     ColumnName = "Address",
 5     DataType = typeof(string),
 6     DefaultValue = "江苏海安"
 7 });
 8 //我们这边使用Add的方法的第二个重载
 9 dt.Rows.Add(new object[] {"11", 44, "222", "yang cao gui"});
10 //我们也可以对添加好的行和列进行读取和修改
11 dt.Columns[0].ColumnName = "wang wei";
12 dt.Rows[0]["wang wei"] = "我把这行这列的值修改了,哈哈";

4858.com 50

    叁用到表明树急速营造友好的列,详细的也可以查MSDN

4858.com 51View Code

  2.DataRowState(行状态),DataRowVersion(行版本)

    一DataRowState(行状态)是“DataRow”中三个很要紧的事态,重要有多个方面:

1     Added          → 添加
2     Deleted        → 删除
3     Detached       → 分离
4     Modified       → 修改
5     Unchanged      → 为改变

     4858.com 52

     Note:借使实例化三个行,但不曾子舆加到别的贰个表中,那么它的场馆永远是Detached,不设有Add,Modified之分,这么些是要小心的!

    2DataRowVersion(行版本),有多个版本状态,如下:

1     Current     → 最近的行,主要针对Deleted操作之前的行,行状态的Deleted
2     Default     → 行的默认状态
3     Original    → 行的原始值 Added,Modified,Unchanged    
4     Proposed    → 行的建议值 

     4858.com 53

    PS:如若想理解它们,应该要写1些示范代码来模拟它们,那样就能很好的熟悉它们了!

    强烈推荐那篇作品:→ 深入.NET
DataTable
(写的很仔细,不错,必要求看的),还有那篇
→ 深入.NET
DataTable(补遗)

  3.DataSet,DataTable

    相比较主要的方法:Select,Merge,Copy,Clone,GetChanges等等

    关于GetChanges方法:获取数据改变的地点,它所取得的是您上次调用AcceptChanges方法之后修改数据的消息,那点要小心了! 

  肆.下边是对DataSet和DataTable讲的相比较好的小说收集  

    DataTable.Select使用小心得

    DataTable
深刻剖析数据源绑定原理之高级篇

    正如五个DataTable数据(结构同样)——五千0条数据仅需几秒

  5.有关“DataRelation”和“DataView”的学问也很重大 

    DataView → 表示用于排序、筛选、搜索、编辑和导航的
DataTable的可绑定数据的自定义视图,看小说:DataSet,DataTable,DataView

    DataRelation → 意味着三个DataTable 对象之间的父/子关系,看文章:DataRelation(DataSet中父亲和儿子表)的1个示范

 

9丶封装数据库操作类(那才是精华) 

     唯有足够知情了上面的学识,才能越来越好的包装,才能写出健康的面向对象数据库操作类库,因笔者知识有限,简单的包裹还可以够,可是不足以见人,所以收集了了一些好小说,供我们来上学:

    1.SqlHelper-
-高悬的双刃剑(到底好用么~~) (提炼更做实壮的代码)

    2.自个儿的DbHelper数据操作类(自定义操作类库)

    3.JSM SqlHelper 2.0
源码下载(封装的更加细啦,有时机钻探钻探)

    4.微软原版SQLHelper类(代码太多,有为数不少我们会用不到,还有重载的也太多了吧!)

  好了就像是此多了,想大约也很简单,想复杂登天还难,哈哈,依旧看个人的精选把,园子里面那上边的稿子也有诸多,一搜一大堆,好好研讨下就ok了!

完工:写了一个星期,终于搞完了,肯定还有好多地点尚未关联到的,大家多多教导…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有