【自然框架】数据访问之精雕细琢(一)存储过程的参数

简介: 目标:  对存储过程的参数进行封装,达到方便操作、更换数据库不需要改代码的目的。 特点:1、 调用方便2、 没有数据库特征。 正文:  现在参数化SQL语句越来越常用了,这就涉及到如何写存储过程的参数的问题。

 

目标:
  对存储过程的参数进行封装,达到方便操作、更换数据库不需要改代码的目的。

特点:
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

 

 

 

如果您对自然框架感兴趣,也可以来看看。

 

 

 

相关文章
|
存储
SQLServer存储过程中的输出参数的使用
SQLServer存储过程中的输出参数的使用
56 0
|
3月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
60 2
|
6月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
74 0
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
311 0
|
6月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
61 0
|
11月前
|
存储 SQL 关系型数据库
MySQL中不同类型参数存储过程示例
MySQL中不同类型参数存储过程示例
127 0
|
存储 SQL 关系型数据库
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 2
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 2
337 0
|
存储 SQL NoSQL
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 1
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 1
485 0
|
存储 SQL
sql server 存储过程传递表名参数及Dynamic SQL
sql server 存储过程传递表名参数及Dynamic SQL
sql server 存储过程传递表名参数及Dynamic SQL
|
存储 SQL 关系型数据库
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)
2096 0
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)