目标:
对存储过程的参数进行封装,达到方便操作、更换数据库不需要改代码的目的。
特点:
1、 调用方便
2、 没有数据库特征。
正文:
现在参数化SQL语句越来越常用了,这就涉及到如何写存储过程的参数的问题。您也许会问,这有啥的直接写不就可以了么?就像下面这段代码。
string sql = "insert into OS_User_Info values(@UserID,@PersonID,@NikeName,@ProvinceID,@CityID,@CountyID,@Introductions,@RegisterDate)"; SqlParameter paramUserID = new SqlParameter("@UserID", SqlDbType.Int); paramUserID.Value = osuser.UserID; SqlParameter paramPersonID = new SqlParameter("@PersonID", SqlDbType.Int); paramPersonID.Value = osuser.PersonID; SqlParameter paramNikeName = new SqlParameter("@NikeName", SqlDbType.NVarChar); paramNikeName.Value = osuser.NikeName; SqlParameter paramProvinceID = new SqlParameter("@ProvinceID", SqlDbType.Int); paramProvinceID.Value = osuser.ProvinceID; SqlParameter paramCityID = new SqlParameter("@CityID", SqlDbType.Int); paramCityID.Value = osuser.CityID; SqlParameter paramCountyID = new SqlParameter("@CountyID", SqlDbType.Int); paramCountyID.Value = osuser.CountyID; SqlParameter paramIntroductions = new SqlParameter("@Introductions", SqlDbType.NText); paramIntroductions.Value = osuser.Introductions; SqlParameter paramRegisterDate = new SqlParameter("@RegisterDate", SqlDbType.DateTime); paramRegisterDate.Value = osuser.RegisterDate; int row = Sql_Helper.ExecuteSql(sql, paramUserID, paramPersonID, paramNikeName, paramProvinceID, paramCityID, paramCountyID, paramIntroductions, paramRegisterDate); if (row == 0) return false; int id = SelectNewID("OS_User_Info"); osuser.OSUserID = id;
我们来看看这样的代码。首先代码不够简洁,不够易读。其次,如果更换其他类型的数据库,那么就需要修改这段代码。
你可能会说,这算啥呀,反正代码生成器生成完了,我也就再也不看了,是否易读有什么关系?换数据库了,再重新生成一遍代码不就OK了?
这样似乎也行,我也想不出来什么反驳的理由。只是我不喜欢这种方式,呵呵。所以我对存储过程的参数进行了一下封装。看下面的这段代码,是不是简洁了许多?
ManagerParameter parm = da.ManagerParameter; parm.ClearParameter(); parm.AddNewInParameter("personName", person.PersonName, 50); parm.AddNewInParameter("gender", person.Gender,1); parm.AddNewInParameter("birthday", person.Birthday); parm.AddNewInParameter("idCard", person.IDCard,19); parm.AddNewInParameter("addedDate", person.AddedDate); parm.AddNewInParameter("UpdatedDate", person.UpdateDate); parm.AddNewInParameter("addedPersonID", person.AddedPersonID); parm.AddNewInParameter("updatedPersonID", person.UpdatedPersonID); //添加数据 string newID = da.ModifyData.InsertData("Person_Info"); person.PersonID = int.Parse(newID);
调用很简单,首先清除以前的参数,然后添加新的参数,最后在调用数据访问的扩展部分来实现数据的添加、修改。也可以实现删除和查询的功能。
1、不需要指定类型,定义和赋值和在一行。
添加存储过程的参数,采用参数重载的方式。分成两种情况,一个是需要指定长度的参数,比如nvarchar等;另一个是不需要指定长度的参数,比如int 、ntext等。然后在函数内部判断参数类型,根据类型和数据库字段的类型进行匹配来设定参数的类型。
这样调用的时候就不用指定类型,第一是为了调用方便,第二是避免出现特定的数据库字段的类型。更换数据库就不用改代码了。
定义和赋值也和在一起,便于阅读。
2、参数名称的小改动
参数名称前面没有加“@”,因为并不是所有类型的数据库,参数前面都加@,写上的话,就不便于更换数据库,所以这里就没有写@,而是在函数内部,根据驱动方式来加前缀。
以上两点,确保了在更换数据库的时候,无需修改代码。这样就避免了重新生成代码,或者是维护两份、多份代码的烦恼了。当然只是这一点还不够,参数化SQL语句也需要一点处理,不过这里说的是参数的封装,就不在这里细说了,下一篇里在说。
在线帮助:http://help.naturefw.com/DAL/Part/ManagerParameter/default.html
数据访问的类图:
========================================================================
园子里的快乐,组织了一个线下活动。5月8日,在北京海淀,有空您的话欢迎来掺呼掺呼。详细介绍如下:
http://www.cnblogs.com/hielvis/archive/2011/05/02/2034649.html
活动时间:2011-5-8
活动地点:北京市海淀区上地七街八维教育内金和软件
活动联系人:快乐之王(186 1024 8500)
活动开始时间:上午10点至10点半
活动结束时间:下午4点半至5点左右
-
三,活动主题
本次活动主要分三个场次:
10:00-10:30:进场,介绍沙龙基本形式和内容,大家相互之间认识一下
10:30-12:00:主要讨论和分享Silverlight,WPF开发相关技术。包括WP7,MVVM,Blend的使用等。
12:30-13:30:感兴趣的根据天气可以举行一场篮球赛,也可以玩乒乓球,室内足球,飞镖等
13:30-15:00:主要讨论Web开发,包括前端,缓存,搜索引擎优化等内容。
15:00-17:00:艺街开放平台架构思路,开源方式,以及发展方向等。如果你还不了解,参见:
http://www.cnblogs.com/hielvis/archive/2011/03/30/1999366.html
如果您对自然框架感兴趣,也可以来看看。