分享
 
 
 

人事管理系统初探(一)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

作为第一个完整的、简单的.NET项目,我很高兴在一个月之内完成人事系统的初级探秘。跟随着杨中科老师的脚步进行对数据库.net的学习。下面我就对整个系统所用到的知识进行简单的总结,如有不对欢迎批评指正:

(一)关于三层架构的介绍:

在开发人事管理系统时候我们进行了三层架构的搭建工作,在vs的项目依赖图如图所示:

用户界面表示层(USL)业务逻辑层(BLL)数据访问层(DAL)BLL将USL与DAL隔开了,并且加入了业务规则(文献来自:http://www.cnblogs.com/gaoweipeng/archive/2009/01/18/1377855.html)

各层的作用1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.

2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx, 如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

具体的区分方法

1:数据数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作。而不必管其他操作。

2:业务逻辑层:主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。

3:表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。

三层结构解释

所谓三层体系结构,是在客户端与数据库之间加入了一个中间层,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。 三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交换.

开发人员可以将应用的商业逻辑放在中间层应用服务器上,把应用的业务逻辑与用户界面分开。在保证客户端功能的前提下,为用户提供一个简洁的界面。这意味着如果需要修改应用程序代码,只需要对中间层应用服务器进行修改,而不用修改成千上万的客户端应用程序。从而使开发人员可以专注于应用系统核心业务逻辑的分析、设计和开发,简化了应用系统的开发、更新和升级工作。那么为什么要应用“中间业务层”呢?举些例子:

我们假设有一段登录代码,则可以这样处理Web程序,外观层负责接收前台页面的数据,然后传给中间层,中间层对数据进行处理,比如格式化,防SQL注入等等一些,这样的数据再传给数据访问层然后与数据库进行操作,比如与数据库的用户名和密码匹配等等一些代码。“中间业务层”的用途有很多,例如:验证用户输入数据、缓存从数据库中读取的数据等等……但是,“中间业务层”的实际目的是将“数据访问层”的最基础的存储逻辑组合起来,形成一种业务规则。例如:“在一个购物网站中有这样的一个规则:在该网站第一次购物的用户,系统为其自动注册”。这样的业务逻辑放在中间层最合适:

在“数据访问层”中,最好不要出现任何“业务逻辑”!也就是说,要保证“数据访问层”的中的函数功能的原子性!即最小性和不可再分。“数据访问层”只管负责存储或读取数据就可以了。

但是在我们的这个项目当中,因为BLL层使用的次数非常少,所以可能我们将BLL层的东西写入到了USL层当中去,这样我们做了一个简化的三层架构,并填入了MODEL层进行串联。

(二)ADO.NET简单梳理(文献来自:ADO.NET——全面梳理)

2.1sqlConnection连接对象:

2.1.1.连接字符串

基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(PassWord)(这种方式比较安全)!

推荐文章 :SQL Server 连接字符串和身份验证,你必须知道的ADO.NET(三) 连接字符串,你小觑了吗?,SQL Server 2008连接字符串写法大全,连接字符串有很多的写法,最保险的写法可以借助“SqlConnectionStringBuilder”类,它提供了全面的连接字符串的属性,以至于减少出错率(相关属性查MSDN),还有大多数连接字符串都写在配置文件里面了!

2.1.2.创建连接对象

SqlConnectionStringBuilder connectionStringBuilder =newSqlConnectionStringBuilder()

{

DataSource="",

InitialCatalog="",

UserID="",

Password=""};

SqlConnection connection=newSqlConnection(connectionStringBuilder.ToString());

当然我们可以选择在config里面进行对链接对象的配置:

<connectionStrings><addname="dbConnStr"connectionString="Data Source=.;Initial Catalog=;User ID=;Password="/></connectionStrings>

然后再利用代码进行连接:

PRivatestaticstringconnStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

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

using(SqlConnection connection =newSqlConnection(connectionStringBuilder.ToString())){connection.Open();connection.Close();}

2.2 SqlCommand(命令对象)

2.2.1.实例化的时候默认初始化的四个属性

2.2.2.创建命令对象

使用连接对象的“CreateCommand()”方法创建命令对象,也可以使用new来实例化对象!

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

2.2.3.几个重要属性

①CommandText:获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程!

②CommandType:设置你执行的SQL语句是存储过程还是T-SQL(是一个枚举)!

③Parameters:设置你T-SQL中你需要用到的参数(后面会讲到),是一个“SqlParametersCollection”类型,这个属性很重要,是你通过代码给SQL语句传递参数的途径,所以记住语法,记住一些使用规则讲对编码有很大的帮助!

2.2.4.几个重要的方法(相信大家熟悉的不能再熟悉了)

①ExecuteNonQuery:返回是影响的行数(int),主要执行更新,添加,删除等操作!

②ExecuteReader:执行SQL或存储过程,返回的是SqlDataReader类型,主要用来查询!

★ 这边注意这个方法的重载 CommandBehaviour 枚举,成员如下:

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

③ExecuteScalar:返回执行结果集中的第一行第一列,如果没有数据,则返回NULL!

Note:因为可能会返回“Null”值,所以需要对结果进行判断,如下:

View Code1 object my = cmd.ExecuteScalar();

2 if (object.Equals(my,null)) //可以使用Equals进行Null值的判断,易读性强

3 Console.WriteLine("Not Data");

4 else

5 Console.WriteLine("Yes");

④CreateParameter:创建SqlParameter实例

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

推荐文章:你必须知道的ADO.NET(六) 谈谈Command对象与数据检索

你必须知道的ADO.NET(七) Wow!Command对象高级应用

2.3 SqlParameter(Sql参数)-----如果没有这个就会产生sql漏洞注入攻击

2.3.1.几个重要的属性

ParameterName: 设置参数名

Value: 给参数设置值

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

SqlDbType: 参数在SQL中的类型

1 SqlParameter paras =newSqlParameter()2{3ParameterName ="@name",4Value =10,5SqlDbType =SqlDbType.Int,6Size =47};

2.3.2.命令对象添加参数集合的几种方法

①AddWithValue

②Add

③AddRange

推荐文章:SqlParameter的作用与用法,代码如下:

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 }

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

上面添加的“SqlParameter”参数都被添加到了“SqlParameterCollection”集合中去了,所以我们才能够对它进行读取和修改!

2.4 SqlDataAdapter(数据适配器)

2.4.1.构造函数

1 四个重载:

2 1. 无参

3 2. SqlDataAdapter(SqlCommand) → 执行命令对象实例

4 3. SqlDataAdapter(String, SqlConnection) → ①只能指定查询语句 ②连接对象实例

5 4. SqlDataAdapter(String, ConnectionString) → 用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的一个新实例

6 Note:第四个重载就把连接对象和命令对象都包含进去了!

2.4.2.填充数据(Fill)

最简单的填充数据

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 }

2.4.3.使用“SqlCommandBuilder”对数据进行增删改查

①添加数据

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 }

②修改数据

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 }

③删除数据

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 }

Note(很重要的注意点):值得注意的是Update方法已经隐式帮我调用了AcceptChanges,不比担心状态为改变删除数据会报错,微软已经帮我们都做好了,其实背后就是做的Table.AcceptChanges()这件事,如果在一般的DataTable中会怎么样,提交自上次调用 AcceptChanges 以来对该行进行的所有更改,在调用这个方法之后,表中所有更改将会提交,所有行状态(RowState)状态都将变为Unchanged,在DataSet中我将会说到这些内容!

2.4.4.关于“SqlDataAdapter”中Fill方法的一些讨论

简单的写一下,MSDN上都有的,查一下就知道了!

1 ★指定填充数据的数量,如:

4 //应该是从第六行开始,后面的十条记录

5 da.Fill(ds,5,10,”MyTable”)

2.5 DataSet,DataTable,DataRow,DataColumn

表示数据存放在缓存中,DataSet里面可以包含多个DataTable,DataTable中有多个DataColumn和多个DataRow,包括对各种对DataTable的操作,以及对列和行的操作,在进行DataSet,DataTable进行操作的时候,应该先判断它们是否为Null,这是最基本的!

1.DataTable,DataRow,DataColumn

①创建自己的DataTable :

1DataTable dt =newDataTable("Table");2DataColumn columnName =newDataColumn();3columnName.ColumnName ="Name";4//columnName.DataType = typeof(string);5//注意和上面一句话的比较6columnName.DataType = Type.GetType("System.String");7columnName.DefaultValue ="YangCaoGui";8dt.Columns.Add(columnName);//DataColumnCollection的集合9DataRow row = dt.NewRow();//使用NewRow方法来实例化一个行10row[columnName] ="WangWei";//采用索引的方式有很多11dt.Rows.Add(row);//DataRowCollection的集合12Console.WriteLine("Type:"+ dt.Columns[0].DataType.Name);

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

构造函数的访问修饰符为Internal,通过这两个集合可以对Column和Row进行“增,删,改,查”,详细见MSDN,如Remove,Add,RemoveAt etc!

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"] = "我把这行这列的值修改了,哈哈";

③使用表达树快速构建自己的列,详细的也可以查MSDN

publicstaticvoidDataTableExpression()

{

DataTable dt=newDataTable("Table");

DataColumn price=newDataColumn("price",typeof(Int32));

DataColumn number=newDataColumn("number",typeof(Int32));

dt.Columns.Add(price);

dt.Columns.Add(number);for(inti =1; i <=5; i++)

{

DataRow newRow=dt.NewRo();

newRow["price"] =i;

newRow["number"] = i +5;

dt.Rows.Add(newRow);

}//显示表数据for(inti =0; i < dt.Rows.Count; i++)

{

Console.WriteLine("Price: {0} , Number:{1}", dt.Rows[i]["price"], dt.Rows[i]["number"]);

}//使用Expression来定制自己的TableConsole.WriteLine("-----------------------------------");

DataColumn total=newDataColumn("total",typeof(Int32));

dt.Columns.Add(total);//可以使用这样的方式来定制自己DataTabledt.Columns["total"].Expression ="price * number";//显示定制后的数据Console.WriteLine("显示数据");for(inti =0; i < dt.Rows.Count; i++)

{

Console.WriteLine("Price: {0} , Number:{1} ,Total:{2}", dt.Rows[i]["price"], dt.Rows[i]["number"], dt.Rows[i]["total"]);

}

}

下次收藏一些sqlhelper的封装数据库操作类(这才是精华)

下面是一些链接的推荐环节:

只有充分理解了上面的知识,才能更好的封装,才能写出健壮的面向对象数据库操作类库,因本人知识有限,简单的封装还可以,但是不足以见人,所以收集了了一些好文章,供我们来学习:

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

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

3.JSM SqlHelper 2.0源码下载(封装的更细啦,有机会研究研究)

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

好了就这么多了,想简单也很简单,想复杂登天还难,哈哈,还是看个人的选择把,园子里面这方面的文章也有很多,一搜一大堆,好好研究下就ok了!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有