ASP.NET三层架构基础详细操作图文教程(二)
2012-02-02 21:43
351 查看
好的,上一篇文章我们讲到了DAL层的配置,并赋上了代码,接下来我们就要来讲解一下这些代码
本文出自:http://www.cnntec.com 作者:AZ猫 转发请注明出处,违者必究
我们接着来分析DAL层倒底做了什么。 首先,大家可以看见,在每个方法里第一行里,我都有定义一个字符串变量,引用类型,并且对这个字符串变量赋了不同的值。 我们一个方法一个方法的来解读
在上面的代码中,我们定义了字符串变量sequel,赋值"SP_UserLogin",这是一个存储过程的名字。
言下之意,即这个方法中,我们要调用一个存储过程。
SqlParameter[]数组是什么呢?这个就是我们要传给存储过程的参数。
在这里调用存储过程有什么好处呢?
调用存储过程有几个好处,第一提高运行的效率,第二方便进行维护。
运行存储过程的效率要高于运行SQL的效率,而且将web压力转到数据库,有利于web与数据库的负载均衡。
当然,存储过程一般是要执行逻辑的运算和物理的运算,单单一条select * from table是没有任何区别的。
第二点我们提到了维护方便,为什么呢?
因为一但我们要改变SQL的逻辑,我们只需要去更改存储过程并更新就OK了,省去了,我们去更改CS文件,再编译,再替换DLL文件的麻烦。如果项目,分布源代码管理同时更新还相当麻烦。
接着分析,我们又定义了一个整型的变量result直观的从英文翻译过来我们可以看懂,这是结果,在这里,这个变量获取的是 SqlHelper.ExecuteScalar返回的值。表示返回第一行第列的值,至于SqlHelper.ExecuteScalar的调用详细我就 不再解释了大家可以去看之后我要发布的源码里的SQLHelper.cs类。 这个返回值,为什么大于0返回true反之返回false,是因为我们存储过程的返回值。
大家可以看脚本,存储过程SP_UserLogin我们返回的是count(id),即查询用户的凭证在数据库中是否有效,如果总数id为0,表示用户传数的参数查询的用户名或密码是无效的,我们数据库中没有这个用户。
OK,我们再看后面的几个方法,insert和update都有整型的返回值result,那么这个result所获得的却是SqlHelper.ExecuteNonQuery方法返回的结果,这个结果是什么呢? 对于Insert操作来说,结果存储过程,返回来的是刚插入的那条数据的唯一索引。 对于update操作来说,返回的结果则是这次操作所影响的行数。
在DAL层中,主要是针对数据进行操作,目前我们是操作的MSSQL数据库的数据。也就是对数据库中的数据进行增,删,改,查。
接下来,我们就要讲讲DAL联合Entity及数据层连合实体类的操作。 先看如下代码:
在如上代码中,第一个方法
返回值为List<T>泛型对象,UserInformation的实体对象。 通过
方法,将数据库中取出的数据,存放到这个List泛型对象中去。后面我们在读述UI层的时候会读出显示的调用方法。
最主要咱们来看看下面这段代码是干神马用的。
看完这个方法,我们先说调用。 代码如下:
这里有一个强制的转换,转为将ValuePatas(实体)方法返回IDbDataParameter[]类型强制转换为SqlParameter[]类型。 为什么要这样做呢?
可能聪明的朋友已经注意到了。 IDbDataParameter[] 是一个通用参数接口,我们不但可以把它转成SqlParameter也可以转换OralceParameter或者DBParameter等等。聪明的朋 友又注意到了吧。我们在DAL层下为什么会有SQLHelper.cs,为什么不能有 OracleHelper,MySqlHelper,AccessSqlHelper等等,对的。如果我们向DAL下加入这些Helper并在 web.config中作出相应的数据库配置,我们不但可以在DAL调用mssql还可以调用oracle,mysql,access等等数据库。这是DAL层支持多数据库的技术所在。
OK,我们对DAL层的解析就到这里为止了,如果还有什么不明白的地方可以到CNNTEC的技术群问我。我一定会耐心的给你讲解。
本文出自:http://www.cnntec.com 作者:AZ猫 转发请注明出处,违者必究
我们接着来分析DAL层倒底做了什么。 首先,大家可以看见,在每个方法里第一行里,我都有定义一个字符串变量,引用类型,并且对这个字符串变量赋了不同的值。 我们一个方法一个方法的来解读
1./// <summary> 2. /// 用户登录验证 3. /// </summary> 4. /// <param name="userName">用户名</param> 5. /// <param name="userPassword">密码</param> 6. /// <returns>布尔值True成功</returns> 7. public static bool UserLogin(string userName, string userPassword) 8. { 9. string sequel = "SP_UserLogin"; 10. SqlParameter[] paras = new SqlParameter[] 11. { 12. new SqlParameter("@UserLoginName", userName), 13. new SqlParameter("@UserPassword",userPassword) 14. }; 15. int result =(int)SqlHelper.ExecuteScalar(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras); 16. if (result > 0) 17. { 18. return true; 19. } 20. else 21. { 22. return false; 23. } 24. }
在上面的代码中,我们定义了字符串变量sequel,赋值"SP_UserLogin",这是一个存储过程的名字。
言下之意,即这个方法中,我们要调用一个存储过程。
SqlParameter[]数组是什么呢?这个就是我们要传给存储过程的参数。
在这里调用存储过程有什么好处呢?
调用存储过程有几个好处,第一提高运行的效率,第二方便进行维护。
运行存储过程的效率要高于运行SQL的效率,而且将web压力转到数据库,有利于web与数据库的负载均衡。
当然,存储过程一般是要执行逻辑的运算和物理的运算,单单一条select * from table是没有任何区别的。
第二点我们提到了维护方便,为什么呢?
因为一但我们要改变SQL的逻辑,我们只需要去更改存储过程并更新就OK了,省去了,我们去更改CS文件,再编译,再替换DLL文件的麻烦。如果项目,分布源代码管理同时更新还相当麻烦。
接着分析,我们又定义了一个整型的变量result直观的从英文翻译过来我们可以看懂,这是结果,在这里,这个变量获取的是 SqlHelper.ExecuteScalar返回的值。表示返回第一行第列的值,至于SqlHelper.ExecuteScalar的调用详细我就 不再解释了大家可以去看之后我要发布的源码里的SQLHelper.cs类。 这个返回值,为什么大于0返回true反之返回false,是因为我们存储过程的返回值。
大家可以看脚本,存储过程SP_UserLogin我们返回的是count(id),即查询用户的凭证在数据库中是否有效,如果总数id为0,表示用户传数的参数查询的用户名或密码是无效的,我们数据库中没有这个用户。
OK,我们再看后面的几个方法,insert和update都有整型的返回值result,那么这个result所获得的却是SqlHelper.ExecuteNonQuery方法返回的结果,这个结果是什么呢? 对于Insert操作来说,结果存储过程,返回来的是刚插入的那条数据的唯一索引。 对于update操作来说,返回的结果则是这次操作所影响的行数。
在DAL层中,主要是针对数据进行操作,目前我们是操作的MSSQL数据库的数据。也就是对数据库中的数据进行增,删,改,查。
接下来,我们就要讲讲DAL联合Entity及数据层连合实体类的操作。 先看如下代码:
1./// <summary> 2. /// 将DataView转换为泛型实体对象 3. /// </summary> 4. /// <param name="dv">DataView</param> 5. /// <returns>泛型实体对象</returns> 6. private static List<StudyCSharp.Entity.UserInformation> LoadListFromDataView(DataView dv) 7. { 8. List<StudyCSharp.Entity.UserInformation> list = new List<StudyCSharp.Entity.UserInformation>(); 9. for (int index = 0; index <= dv.Count - 1; index++) 10. { 11. list.Add(GetEntity(dv[index].Row)); 12. } 13. return list; 14. } 15. 16. /// <summary> 17. /// 从DataReader中读取数据映射到实体类的属性中 18. /// </summary> 19. /// <remarks></remarks> 20. private static StudyCSharp.Entity.UserInformation GetEntity(IDataReader dataReader) 21. { 22. StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation(); 23. if (!dataReader["ID"].Equals(DBNull.Value)) 24. _obj.ID = Convert.ToInt32(dataReader["ID"]); 25. if (!dataReader["UserName"].Equals(DBNull.Value)) 26. _obj.UserName = Convert.ToString(dataReader["UserName"]); 27. if (!dataReader["UserPassword"].Equals(DBNull.Value)) 28. _obj.UserPassword = Convert.ToString(dataReader["UserPassword"]); 29. return _obj; 30. } 31. /// <summary> 32. /// 从行中读取数据映射到实体类的属性中 33. /// </summary> 34. /// <remarks></remarks> 35. private static StudyCSharp.Entity.UserInformation GetEntity(DataRow row) 36. { 37. StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation(); 38. if (!row["ID"].Equals(DBNull.Value)) 39. _obj.ID = Convert.ToInt32(row["ID"]); 40. if (!row["UserName"].Equals(DBNull.Value)) 41. _obj.UserName = Convert.ToString(row["UserName"]); 42. if (!row["UserPassword"].Equals(DBNull.Value)) 43. _obj.UserPassword = Convert.ToString(row["UserPassword"]); 44. return _obj; 45. } 46. 47. /// <summary> 48. /// 该数据访问对象的属性值装载到数据库更新参数数组Insert用 49. /// </summary> 50. /// <remarks></remarks> 51. private static IDbDataParameter[] ValueParas(StudyCSharp.Entity.UserInformation _obj) 52. { 53. SqlParameter[] paras = new SqlParameter[3]; 54. paras[0] = new SqlParameter("@ID", _obj.ID); 55. paras[1] = new SqlParameter("@UserName", _obj.UserName); 56. paras[2] = new SqlParameter("@UserPassword", _obj.UserPassword); 57. 58. paras[0].DbType = DbType.Int32; 59. paras[1].DbType = DbType.String; 60. paras[2].DbType = DbType.String; 61. 62. return paras; 63. }
在如上代码中,第一个方法
1.private static List<StudyCSharp.Entity.UserInformation> LoadListFromDataView(DataView dv)
返回值为List<T>泛型对象,UserInformation的实体对象。 通过
1.private static StudyCSharp.Entity.UserInformation GetEntity(DataRow row)
方法,将数据库中取出的数据,存放到这个List泛型对象中去。后面我们在读述UI层的时候会读出显示的调用方法。
最主要咱们来看看下面这段代码是干神马用的。
1./// <summary> 2./// 该数据访问对象的属性值装载到数据库更新参数数组Insert用 3./// </summary> 4./// <remarks></remarks> 5.private static IDbDataParameter[] ValueParas(StudyCSharp.Entity.UserInformation _obj) 6.{ 7.SqlParameter[] paras = new SqlParameter[3]; 8.paras[0] = new SqlParameter("@ID", _obj.ID); 9.paras[1] = new SqlParameter("@UserName", _obj.UserName); 10.paras[2] = new SqlParameter("@UserPassword", _obj.UserPassword); 11. 12.paras[0].DbType = DbType.Int32; 13.paras[1].DbType = DbType.String; 14.paras[2].DbType = DbType.String; 15. 16.return paras; 17.}
看完这个方法,我们先说调用。 代码如下:
1.SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
这里有一个强制的转换,转为将ValuePatas(实体)方法返回IDbDataParameter[]类型强制转换为SqlParameter[]类型。 为什么要这样做呢?
可能聪明的朋友已经注意到了。 IDbDataParameter[] 是一个通用参数接口,我们不但可以把它转成SqlParameter也可以转换OralceParameter或者DBParameter等等。聪明的朋 友又注意到了吧。我们在DAL层下为什么会有SQLHelper.cs,为什么不能有 OracleHelper,MySqlHelper,AccessSqlHelper等等,对的。如果我们向DAL下加入这些Helper并在 web.config中作出相应的数据库配置,我们不但可以在DAL调用mssql还可以调用oracle,mysql,access等等数据库。这是DAL层支持多数据库的技术所在。
OK,我们对DAL层的解析就到这里为止了,如果还有什么不明白的地方可以到CNNTEC的技术群问我。我一定会耐心的给你讲解。
相关文章推荐
- ASP.NET三层架构基础详细操作图文教程(三)
- ASP.NET三层架构基础详细操作图文教程(四)
- ASP.NET三层架构基础详细操作图文教程
- ASP.NET MVC三层架构基础详细操作图文教程(VS2017)(2)
- ASP.NET MVC三层架构基础详细操作图文教程(VS2017)(1)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- ASP.NET MVC三层架构基础详细操作图文教程(VS2017)(3)
- ASP.NET创建三层架构图解详细教程
- ASP.NET创建三层架构图解详细教程
- ASP.NET创建三层架构图解详细教程
- Asp.Net Web-api 不可多得的零基础教程10
- 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门
- Scott Mitchell 的ASP.NET 2.0数据教程之三:在Asp.net 2.0中操作数据,母板页和站点导航
- SVN(TortoiseSVN)详细教程(二)--TortoiseSVN Client基础操作
- ASP.NET Web API教程 创建域模型的方法详细介绍
- ASP.NET 2.0中的数据操作系列教程20:定制数据修改界面
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
- ASP.NET基础教程-TreeView树控件-给TreeView控件添加结点
- asp.net Excel导入数据到数据库 详细教程
- ASP.Net Web-api 不可多得的零基础教程2