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

简介: 目标:  对存储过程的参数进行封装,达到方便操作、更换数据库不需要改代码的目的。 特点: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

 

 

 

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

 

 

 

相关文章
|
6月前
|
存储
SQLServer存储过程中的输出参数的使用
SQLServer存储过程中的输出参数的使用
38 0
|
3月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
36 0
|
3月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
35 0
|
10月前
|
存储 SQL 关系型数据库
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 2
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 2
275 0
|
10月前
|
存储 SQL NoSQL
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 1
【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql 1
430 0
|
存储 SQL
sql server 存储过程传递表名参数及Dynamic SQL
sql server 存储过程传递表名参数及Dynamic SQL
sql server 存储过程传递表名参数及Dynamic SQL
|
存储 SQL 关系型数据库
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)
1574 0
MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)
|
存储 关系型数据库 MySQL
【MySQL】使用pdo调用存储过程 --带参数输出
【MySQL】使用pdo调用存储过程 --带参数输出
145 0
【MySQL】使用pdo调用存储过程 --带参数输出
|
存储 SQL 数据库连接
SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值
原文:SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值     我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked Server), 调用存储过程过程时,参数不能为NULL值。
855 0
|
存储 SQL
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowset
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowsetexec sp_procedure_params_rowset 'up_rpt营业收入汇总表' PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE...
1048 0