您的位置:首页 > 编程语言 > ASP

ASP.NET三层架构基础详细操作图文教程(二)

2012-02-02 21:43 351 查看
好的,上一篇文章我们讲到了DAL层的配置,并赋上了代码,接下来我们就要来讲解一下这些代码

本文出自: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的技术群问我。我一定会耐心的给你讲解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐