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

作者:白宁超

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

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

1 概述

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

2 类库的引用

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

using System; //系统类库
using System.Collections.Generic;
using System.Linq; //Linq类库,对linq操作使用
using System.Text;
using System.Configuration; //数据库配置使用
using System.Data.SqlClient;
using System.Data;

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

3 公用连接字符串

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

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

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

4 类库方法逐个剖析

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

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

       /// <summary>
/// 执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">参数数组</param>
public static int ExecuteNonParaQuery(string sql)
{
int res = -1;
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
conn.Open();
res = cmd.ExecuteNonQuery();
}
}
return res;
}

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

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

        /// <summary>
/// 执行非查询sql语句,返回受影响行数,如果执行非增删改则返回-1
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">参数数组</param>
/// <returns>影响行数res</returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] paras)
{
int res = -1;
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
if (paras != null || paras.Length > 0)
{
cmd.Parameters.AddRange(paras);
}
conn.Open();
res = cmd.ExecuteNonQuery();
}
}
return res;
}

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

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

        /// <summary>
/// 执行查询sql语句,返回一个无参数dataset对象
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras"></param>
/// <returns>返回dataset 对象</returns>
public static DataSet GetDataSetNotPara(string sql)
{
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//根据传来的参数。决定是sql语句还是存储过程
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(ds);
}
}
}
return ds;
}

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

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

         /// <summary>
/// 执行读取数据,返回一个对象
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">参数数组</param>
/// <returns>返回一个对象o</returns>
public static object ExecuteScalar(string sql, params SqlParameter[] paras)
{
object o = null;
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
if (paras != null)
{
cmd.Parameters.AddRange(paras);
}
conn.Open();
o = cmd.ExecuteScalar();
}
}
return o;
}

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

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

         /// <summary>
/// 执行查询sql语句,返回一个无参数dataset对象
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras"></param>
/// <returns>返回dataset 对象</returns>
public static DataTable GetDataTableNotPara(string sql)
{
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//根据传来的参数。决定是sql语句还是存储过程 conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(dt);
}
}
}
return dt;
}

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

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

        /// <summary>
/// 执行查询sql语句,返回一个dataset对象
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">查询参数</param>
/// <returns>返回dataset 对象</returns>
public static DataSet GetDataSet(string sql, params SqlParameter[] paras)
{
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//根据传来的参数。决定是sql语句还是存储过程
cmd.CommandType = CommandType.StoredProcedure;
//添加参数
cmd.Parameters.AddRange(paras);
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(ds);
}
}
}
return ds;
}

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

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

        /// <summary>
/// 可以执行sql语句或存储过程
/// </summary>
/// <param name="text"></param>
/// <param name="ct"></param>
/// <param name="param"></param>
/// <returns></returns>
public static DataTable ProcGetTable(string sql, params SqlParameter[] param)
{
DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//根据传来的参数。决定是sql语句还是存储过程 cmd.CommandType = CommandType.StoredProcedure;
//添加参数
cmd.Parameters.AddRange(param);
//cmd.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = param[0];
//cmd.Parameters.Add("@pwd", SqlDbType.NVarChar, 20).Value = param[1];
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(dt);
}
}
}
return dt;
}

4.8 调用分页的方法

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

        /// <summary>
/// 实现分页功能
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">参数数组(显示index页和每页显示条数size)</param>
/// <returns>查询结果</returns>
public static DataTable GetParaTable(string sql, params SqlParameter[] paras)
{
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connstr))
{
using (SqlDataAdapter da = new SqlDataAdapter(sql, conn))
{
if (paras != null)
{
da.SelectCommand.Parameters.AddRange(paras);
}
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds);
}
}
return ds.Tables[0];
}
}
}

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 分组函数查询

select COUNT(*) as 总人数 from student
select COUNT(distinct sno) as '选修的总人数' from sc
select AVG(grade) as '平均成绩' from sc where sno='10021'
select MAX(grade) as 'MAX成绩' from sc where sno='10021'
select MIN(grade) as 'MIN成绩' from sc where sno='10021'
select SUM(grade) as '总成绩' from sc where sno='10021'
select SUM(grade)/COUNT(grade) as '平均成绩' from sc where sno='10021'
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 视图相关操作

--视图的创建

create view VIEW_STUGrade(学号,姓名,课程,成绩)

as

select student.sno,student.sname,course.cname,sc.grade from student,course,sc

where student.sno=sc.sno and course.cno=sc.cno and student.sdept='软件'

--查看视图

select * from VIEW_STUGrade

--视图修改

alter view VIEW_STUGrade(学号,姓名,课程,成绩)

as

select student.sno,student.sname,course.cname,sc.grade from student,course,sc

where student.sno=sc.sno and course.cno=sc.cno and student.sdept='软件'

with check option

--更新失败后不影响视图查看

--视图更新

update VIEW_STUGrade set 姓名='王超' where 学号='10022' select * from student where  sno='10022'

/* 1,可更新视图:   a,单个基本表导出的 2,不可更新视图   a 两个以上基本表导出的   b 视图字段来自表达式或者函数   c 嵌套查询的表   d 分组子句使用distinct */

--删除视图 drop view VIEW_STUGrade

5.15 函数相关操作

--创建函数

CREATE FUNCTION GetTime (    @date1 datetime,   @date2 datetime )
RETURNS TABLE
AS RETURN (
select datediff(dd,@date1,@date2) 日差,datediff(mm,@date1,@date2) 月差, datediff(yy,@date1,@date2) 年差
)

5.16 存储过程相关操作

--创建存储过程,

GO create proc [dbo].[sel] (

@sno char()

)

as

select * from student where sno=@sno

exec sel @sno=''

--查看

GO create proc sel2

as

select * from student

exec sel2

--修改

GO create proc updat @sno char(), @sex char()

as

update student set sex=@sex where sno=@sno

select * from student  exec updat @sno='', @sex='女'

--删除

GO create proc dele @sno char()

as

delete student where sno=@sno

select * from student

exec dele @sno=''

--插入

GO create proc inser @sno char(), @sname char(), @sex char(), @sage smallint, @sdept char()

as

insert into student values(@sno,@sname,@sex,@sage,@sdept)

exec inser @sno='', @sname='tom', @sex='男', @sage=, @sdept='sc' select * from student

5.17 触发器相关操作

--触发器
use Studets
GO create trigger insert_Tri
ON student after
insert as print '有新数据插入!'
GO create trigger update_Tri
on student after
update as print '有数据更新!'
------
GO create trigger delete_Tri
on student after
delete as print '有数据删除!
--修改触发器
GO alter trigger delete_Tri
on student after delete
as
if '王帅' in (select sname from deleted)
print '该信息不许删除!'
rollback transaction
--执行存储过程查看触发器使用情况
exc inser @sno='10029', @sname='王帅', @sex='男', @sage=25, @sdept='国贸'
exec updat @sno='10029', @sex='女'
exec dele @sno='10029'
--查看,修改,删除触发器
/* sp_*+触发器名称
sp_helptext:触发器正文信息 sp_help:查看一般信息,触发器名称,属性,创建时间,类型 sp_depends:引用或指定表的所有触发器 sp_helptrigger:指定信息 */ sp_help delete_Tri
sp_helptext delete_Tri
sp_depends delete_Tri
sp_helptrigger student
--删除触发器
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. python基础之day1

    Python 简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python为我们提供了非常完善的基础代码库,覆盖了 ...

  2. 设置DataGridView的某个单元格为ComboBox

    怎么将DataGridView的 某个单元格设为ComboBox的样式而不是整列都改变样式? 1.最简单的方法:利用DataGridView提供的DataGridViewComboBoxCell. 写 ...

  3. WebClient 数据传输

    数据提交 post  ,get public string WebClientPost(string PostData, string PostUrl, string Type) { string p ...

  4. WPF整理-Mutex确保Application单例运行

    有时我们不希望我们的WPF应用程序可以同时运行有多个实例,当我们试图运行第二个实例的时候,已经运行的实例也应该弹出来. 我们可以用Mutex来实现 打开App.xaml.cs,在App类中添加如下内容 ...

  5. ios 定位

    ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...

  6. International Conference for Smart Health 2015 Call for Papers

    Advancing Informatics for healthcare and healthcare applications has become an international researc ...

  7. ABP理论学习之异常处理

    返回总目录 本篇目录 介绍 开启错误处理 非Ajax请求 展示异常信息 UserFriendlyException Error模型 Ajax请求 异常事件 介绍 在一个web应用中,异常通常是在MVC ...

  8. io.js入门(一)—— 初识io.js

    io.js可以说是彻底从NodeJS里分离出来的一条分支,其事情始末可以查看这篇报道,此处便也不赘言.既然是分支,io.js便也基本兼容NodeJS的各种API,连执行指令也依旧兼容Node的 nod ...

  9. Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门

    一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...

  10. 一个App完成入门篇-终结篇(八)- 应用收官

    经过以上几步的学习,我们终于来到最后一个步骤了,应用APP也接近尾声. 通过之前的几节教程,不知道您对使用DeviceOne开发一个应用是不是已经得心应手了,本节教程将教会大家如何在开发完成之后通过D ...