【类库】私房干货.Net数据层方法的封装

作者:白宁超

时间:2016年3月5日22:51:47

摘要:继上篇《Oracle手边常用70则脚本知识汇总》文章的发表,引起很多朋友关注。便促使笔者收集整理此文。本文主要针是对微软技术对数据库(下文案例采用的)操作时,调用执行方法的封装,这也是数年逐渐学习、吸收、实践、完成的一个类库。其中不免有不合理之处,亦或是不符合个别读者的使用习惯。在此,共享此文,权当互相学习。(本文原创,转载注明出处:私房干货.Net数据层方法的封装

1 概述

本文分以下几个部分,第一部分概述,整个文章布局;第二部分介绍类的引用;第三部分介绍公用连接字符串;第四部分分别介绍不含参数执行方法(返回影响行数)、含参数执行方法(返回影响行数)、不含参数执行方法(返回对象)、含参数执行方法(返回对象)、不含参数查询方法(返回对象)、含参数的查询方法(返回对象)、调用存储过程的方法(返回对象)、调用分页的方法;第五部分对SQL Server的部分核心常用语句进行补充;最后附上完整类库。

2 类库的引用

笔试之前从事net技术,对类的引用习惯见到诸如using System;但是这点在后来至今使用java引用是不一样的;这也是笔者看到using引用亲切之所在。本类引用如下:

  1. using System; //系统类库
  2. using System.Collections.Generic;
  3. using System.Linq; //Linq类库,对linq操作使用
  4. using System.Text;
  5. using System.Configuration; //数据库配置使用
  6. using System.Data.SqlClient;
  7. using System.Data;

诸如以上方法的引用方式,如何使用大家都清楚,但是对using调用底层,建议有兴趣的朋友参照《C#高级编程》,此处不是强调的重点,大家知道这些引用即可

3 公用连接字符串

数据库的连接分为两种:其一便是写下单页面的数据库连接(即每个页面重复一样的连接语句)其二便是在公共资源文件中统一配置,采用如下语句调用即可:

  1. static string connstr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString; //读取配置文件中的连接字符串

这样配置的优点,显而易见,优化代码,减少冗余,便于修改和调用。相反,逐个页面去写连接语句,如果需要修改,很大的工作量且容易漏改。这里也是强调封装好处。

4 类库方法逐个剖析

4.1 不含参数执行方法的封装(返回影响行数)

本方法执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1,详细内容如下:

  1. /// <summary>
  2. /// 执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras">参数数组</param>
  6. public static int ExecuteNonParaQuery(string sql)
  7. {
  8. int res = -1;
  9. using (SqlConnection conn = new SqlConnection(connstr))
  10. {
  11. using (SqlCommand cmd = new SqlCommand(sql, conn))
  12. {
  13. conn.Open();
  14. res = cmd.ExecuteNonQuery();
  15. }
  16. }
  17. return res;
  18. }

4.2 含参数执行方法的封装(返回影响行数)

本方法执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1,详细内容如下:

  1. /// <summary>
  2. /// 执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras">参数数组</param>
  6. /// <returns>影响行数res</returns>
  7. public static int ExecuteNonQuery(string sql, params SqlParameter[] paras)
  8. {
  9. int res = -1;
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlCommand cmd = new SqlCommand(sql, conn))
  13. {
  14. cmd.CommandType = CommandType.StoredProcedure;
  15. if (paras != null || paras.Length > 0)
  16. {
  17. cmd.Parameters.AddRange(paras);
  18. }
  19. conn.Open();
  20. res = cmd.ExecuteNonQuery();
  21. }
  22. }
  23. return res;
  24. }

4.3 不含参数执行方法(返回对象)

本方法执行读取数据,返回一个对象,详细方法剖析如下:

  1. /// <summary>
  2. /// 执行查询sql语句,返回一个无参数dataset对象
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras"></param>
  6. /// <returns>返回dataset 对象</returns>
  7. public static DataSet GetDataSetNotPara(string sql)
  8. {
  9. DataSet ds = new DataSet();
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlCommand cmd = new SqlCommand(sql, conn))
  13. {
  14. //根据传来的参数。决定是sql语句还是存储过程
  15. cmd.CommandType = CommandType.StoredProcedure;
  16. conn.Open();
  17. using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
  18. {
  19. sda.Fill(ds);
  20. }
  21. }
  22. }
  23. return ds;
  24. }

4.4 含参数执行方法(返回对象)

本方法执行读取数据,返回一个对象,详细方法剖析如下:

  1. /// <summary>
  2. /// 执行读取数据,返回一个对象
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras">参数数组</param>
  6. /// <returns>返回一个对象o</returns>
  7. public static object ExecuteScalar(string sql, params SqlParameter[] paras)
  8. {
  9. object o = null;
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlCommand cmd = new SqlCommand(sql, conn))
  13. {
  14. cmd.CommandType = CommandType.StoredProcedure;
  15. if (paras != null)
  16. {
  17. cmd.Parameters.AddRange(paras);
  18. }
  19. conn.Open();
  20. o = cmd.ExecuteScalar();
  21. }
  22. }
  23. return o;
  24. }

4.5 不含参数查询方法(返回对象)

本方法执行查询sql语句,返回一个无参数dataset对象,详细方法剖析如下:

  1. /// <summary>
  2. /// 执行查询sql语句,返回一个无参数dataset对象
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras"></param>
  6. /// <returns>返回dataset 对象</returns>
  7. public static DataTable GetDataTableNotPara(string sql)
  8. {
  9. DataTable dt = new DataTable();
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlCommand cmd = new SqlCommand(sql, conn))
  13. {
  14. //根据传来的参数。决定是sql语句还是存储过程
  15.  
  16. conn.Open();
  17. using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
  18. {
  19. sda.Fill(dt);
  20. }
  21. }
  22. }
  23. return dt;
  24. }

4.6 含参数的查询方法(返回对象)

本方法执行查询sql语句,返回一个参数dataset对象,详细方法剖析如下:

  1. /// <summary>
  2. /// 执行查询sql语句,返回一个dataset对象
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras">查询参数</param>
  6. /// <returns>返回dataset 对象</returns>
  7. public static DataSet GetDataSet(string sql, params SqlParameter[] paras)
  8. {
  9. DataSet ds = new DataSet();
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlCommand cmd = new SqlCommand(sql, conn))
  13. {
  14. //根据传来的参数。决定是sql语句还是存储过程
  15. cmd.CommandType = CommandType.StoredProcedure;
  16. //添加参数
  17. cmd.Parameters.AddRange(paras);
  18. conn.Open();
  19. using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
  20. {
  21. sda.Fill(ds);
  22. }
  23. }
  24. }
  25. return ds;
  26. }

4.7 调用存储过程的方法(返回对象)

本方法可以执行sql语句或存储过程,详细方法剖析如下:

  1. /// <summary>
  2. /// 可以执行sql语句或存储过程
  3. /// </summary>
  4. /// <param name="text"></param>
  5. /// <param name="ct"></param>
  6. /// <param name="param"></param>
  7. /// <returns></returns>
  8. public static DataTable ProcGetTable(string sql, params SqlParameter[] param)
  9. {
  10. DataTable dt = new DataTable();
  11.  
  12. using (SqlConnection conn = new SqlConnection(connstr))
  13. {
  14. using (SqlCommand cmd = new SqlCommand(sql, conn))
  15. {
  16. //根据传来的参数。决定是sql语句还是存储过程
  17.  
  18. cmd.CommandType = CommandType.StoredProcedure;
  19. //添加参数
  20. cmd.Parameters.AddRange(param);
  21. //cmd.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = param[0];
  22. //cmd.Parameters.Add("@pwd", SqlDbType.NVarChar, 20).Value = param[1];
  23. conn.Open();
  24. using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
  25. {
  26. sda.Fill(dt);
  27. }
  28. }
  29. }
  30. return dt;
  31. }

4.8 调用分页的方法

本方法实现分页功能,详细方法剖析如下:

  1. /// <summary>
  2. /// 实现分页功能
  3. /// </summary>
  4. /// <param name="sql">sql语句</param>
  5. /// <param name="paras">参数数组(显示index页和每页显示条数size)</param>
  6. /// <returns>查询结果</returns>
  7. public static DataTable GetParaTable(string sql, params SqlParameter[] paras)
  8. {
  9. DataSet ds = new DataSet();
  10. using (SqlConnection conn = new SqlConnection(connstr))
  11. {
  12. using (SqlDataAdapter da = new SqlDataAdapter(sql, conn))
  13. {
  14. if (paras != null)
  15. {
  16. da.SelectCommand.Parameters.AddRange(paras);
  17. }
  18. da.SelectCommand.CommandType = CommandType.StoredProcedure;
  19. da.Fill(ds);
  20. }
  21. }
  22. return ds.Tables[0];
  23. }
  24. }
  25. }

5 SQL Server的部分核心常用语句进行补充

5.1 去掉重复行

select distinct 字段 from 表

5.2 格式化查询

select sname as '姓名',2013-sage as '出生日期' from student

select sname,'出生日期',2013-sage   from student

select 姓名=sname,出生日期=2013-sage  from student

5.3 条件查询

select * from course where ccredit>3

select * from course where ccredit between 2 and 5

select * from course where ccredit> 2 and ccredit<5

select * from course where ccredit in(2)

select * from course where ccredit  not in(2)

5.4 匹配查询

select * from student  where sname like '刘__'

select * from student  where sname like '_表__'

select * from student  where sname like '%表%'

5.5 算术元算查询

select grade*(1+0.2) as 总成绩,grade/(10) as 绩点 from sc

5.6 分组函数查询

  1. select COUNT(*) as 总人数 from student
  2. select COUNT(distinct sno) as '选修的总人数' from sc
  3. select AVG(grade) as '平均成绩' from sc where sno='10021'
  4. select MAX(grade) as 'MAX成绩' from sc where sno='10021'
  5. select MIN(grade) as 'MIN成绩' from sc where sno='10021'
  6. select SUM(grade) as '总成绩' from sc where sno='10021'
  7. select SUM(grade)/COUNT(grade) as '平均成绩' from sc where sno='10021'
  8. select SUM(grade) as '总成绩' from sc group by sno having sum(grade)>100

5.7 等值连接

select distinct student.*,sc.* from student,sc where student.sno=sc.sno

5.8 自身连接

select distinct A.*,B.* from student A,sc B where A.sno=B.sno

select B.sname as '同一个系' from student A,student B where A.sname='白居易' and A.sdept=B.sdept

5.9 外连接

select A.*,B.* from student  A left join sc B on A.sno=B.sno

select A.*,B.* from student  A right join sc B on A.sno=B.sno

select A.*,B.* from student  A FULL join sc B on A.sno=B.sno

5.10 复合条件连接

select * from sc select * from course

select distinct  A.*,B.* from student A,sc B where A.sno=B.sno and B.grade>99 and B.cno='002'

select distinct  A.*,B.*,C.* from student A,sc B,course C where A.sno=B.sno and B.cno=C.cno and B.grade>99 and B.cno='002'

5.11 字符串连接查询

select sname+sno from student

select distinct sname from student ,sc where student.sno=sc.sno

select  sname from student ,sc where student.sno=sc.sno and student.sno not in (select sno from sc where grade<60) group by sname

5.12 子查询

select * from student where sage>(select AVG(sage) from student)

5.13 sql创建用户

sys.sp_addlogin bnc,bnc,Studets sp_adduser bnc,bnc

--权限分配和收回

grant select on student to bnc

select * from student

revoke select on student from bnc

5.14 视图相关操作

  1. --视图的创建
  2.  
  3. create view VIEW_STUGrade(学号,姓名,课程,成绩)
  4.  
  5. as
  6.  
  7. select student.sno,student.sname,course.cname,sc.grade from student,course,sc
  8.  
  9. where student.sno=sc.sno and course.cno=sc.cno and student.sdept='软件'
  10.  
  11. --查看视图
  12.  
  13. select * from VIEW_STUGrade
  14.  
  15. --视图修改
  16.  
  17. alter view VIEW_STUGrade(学号,姓名,课程,成绩)
  18.  
  19. as
  20.  
  21. select student.sno,student.sname,course.cname,sc.grade from student,course,sc
  22.  
  23. where student.sno=sc.sno and course.cno=sc.cno and student.sdept='软件'
  24.  
  25. with check option
  26.  
  27. --更新失败后不影响视图查看
  28.  
  29. --视图更新
  30.  
  31. update VIEW_STUGrade set 姓名='王超' where 学号='10022' select * from student where sno='10022'
  32.  
  33. /* 1,可更新视图: a,单个基本表导出的 2,不可更新视图 a 两个以上基本表导出的 b 视图字段来自表达式或者函数 c 嵌套查询的表 d 分组子句使用distinct */
  34.  
  35. --删除视图 drop view VIEW_STUGrade

5.15 函数相关操作

  1. --创建函数
  2.  
  3. CREATE FUNCTION GetTime ( @date1 datetime, @date2 datetime )
  4. RETURNS TABLE
  5. AS RETURN (
  6. select datediff(dd,@date1,@date2) 日差,datediff(mm,@date1,@date2) 月差, datediff(yy,@date1,@date2) 年差
  7. )

5.16 存储过程相关操作

  1. --创建存储过程,
  2.  
  3. GO create proc [dbo].[sel] (
  4.  
  5. @sno char()
  6.  
  7. )
  8.  
  9. as
  10.  
  11. select * from student where sno=@sno
  12.  
  13. exec sel @sno=''
  14.  
  15. --查看
  16.  
  17. GO create proc sel2
  18.  
  19. as
  20.  
  21. select * from student
  22.  
  23. exec sel2
  24.  
  25. --修改
  26.  
  27. GO create proc updat @sno char(), @sex char()
  28.  
  29. as
  30.  
  31. update student set sex=@sex where sno=@sno
  32.  
  33. select * from student exec updat @sno='', @sex='女'
  34.  
  35. --删除
  36.  
  37. GO create proc dele @sno char()
  38.  
  39. as
  40.  
  41. delete student where sno=@sno
  42.  
  43. select * from student
  44.  
  45. exec dele @sno=''
  46.  
  47. --插入
  48.  
  49. GO create proc inser @sno char(), @sname char(), @sex char(), @sage smallint, @sdept char()
  50.  
  51. as
  52.  
  53. insert into student values(@sno,@sname,@sex,@sage,@sdept)
  54.  
  55. exec inser @sno='', @sname='tom', @sex='男', @sage=, @sdept='sc' select * from student

5.17 触发器相关操作

  1. --触发器
  2. use Studets
  3. GO create trigger insert_Tri
  4. ON student after
  5. insert as print '有新数据插入!'
  6. GO create trigger update_Tri
  7. on student after
  8. update as print '有数据更新!'
  9. ------
  10. GO create trigger delete_Tri
  11. on student after
  12. delete as print '有数据删除!
  13. --修改触发器
  14. GO alter trigger delete_Tri
  15. on student after delete
  16. as
  17. if '王帅' in (select sname from deleted)
  18. print '该信息不许删除!'
  19. rollback transaction
  20. --执行存储过程查看触发器使用情况
  21. exc inser @sno='10029', @sname='王帅', @sex='', @sage=25, @sdept='国贸'
  22. exec updat @sno='10029', @sex=''
  23. exec dele @sno='10029'
  24. --查看,修改,删除触发器
  25. /* sp_*+触发器名称
  26. sp_helptext:触发器正文信息 sp_help:查看一般信息,触发器名称,属性,创建时间,类型 sp_depends:引用或指定表的所有触发器 sp_helptrigger:指定信息 */ sp_help delete_Tri
  27. sp_helptext delete_Tri
  28. sp_depends delete_Tri
  29. sp_helptrigger student
  30. --删除触发器
  31. drop trigger delete_Tri

6 类库源码分享

数据层类库封装源码 访问密码 023d

【类库】私房干货.Net数据层方法的封装的更多相关文章

  1. C 语言中实现数据与方法的封装

    在 C 语言中可以用结构体代替类,用函数指针代替成员方法,实现数据成员与成员方法的封装,在客户端写出的程序与 C++ 类似,唯一的不同是 C 语言中调用函数指针成员时必须将本对象的地址传给函数,因为 ...

  2. Kotlin安卓页面本地存储数据(方法和封装)

    直接上代码 封装: //存储key对应的数据 fun saveData(context: Activity, key: String, info: String) { val sharedPrefer ...

  3. EF 通用数据层父类方法小结

    MSSql 数据库 数据层 父类 增删改查: using System;using System.Collections.Generic;using System.Data;using System. ...

  4. 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  5. 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  6. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  7. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  8. php yaf框架扩展实践五——数据层

    从狭义角度上来理解数据层就是数据库,比较广义的理解来看数据库.远程数据.文件等都可以看做数据层.项目初期的时候一般单一的数据库就可以了,随着流量的增大就要对数据层做很多的改进,例如增加从库分散读压力, ...

  9. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

随机推荐

  1. *HDU2147 博弈

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others)Total ...

  2. Mysql 表分区

    是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...

  3. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...

  4. Excel导入导出组件的设计

    前言: 距离一篇文章,又八九个月过去了,随着在园子露脸的次数越来越少,正如我们淡忘上一波大神那样,我们也正下一波所淡忘. 这八九个月,前前后,游走在十来个项目上,忙,却找不到成就感. 人过30后,也是 ...

  5. dagger2 备注

    dagger 2是android下的IOC框架,类似java服务端的spring,但功能上远没有其强大.个人理解不管是APP还是服务端依赖注入的本质都是一样的,用于解耦某个服务的定义和实现.我自己给出 ...

  6. 企业IT管理员IE11升级指南【6】—— Internet Explorer 11面向IT专业人员的常见问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  7. 在VMWare中建立Hadoop虚拟集群的详细步骤(使用CentOS)

    最近在学习Hadoop,于是想使用VMWare建立一个虚拟的集群环境.网上有很多参考资料,但参照其步骤进行设置时却还是遇到了不少问题,所以在这里详细写一下我的配置过程,以及其中遇到的问题及相应的解决方 ...

  8. struts2 标签怪事

    <s:if test="4 ge 3">111</s:if><s:else>222</s:else> 结果竟然是222 难道不是 4 ...

  9. Python框架之Tornado(四)源码之褪去模板外衣的前戏

    执行字符串表示的函数,并为该函数提供全局变量 本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了.废话不多说,直接上代码: # ...

  10. Java易混淆的概率:成员变量、类变量、实例变量、局部变量

    先看代码 public class Variable{ int b=0; //实例变量 static int a=0; //类变量 final String c="wws"; // ...