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

 

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

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

 

 

 

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

 

 

 

时间: 2024-10-22 22:16:33

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

在ASP.NET 2.0中操作数据之一:创建一个数据访问层_自学过程

导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇.我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层.在打下这个后端的基础工作之后,我们将开始转向报表,示范如何显示,汇总

Enterprise Library 2.0 Hands On Lab 翻译(2):数据访问程序块(二)

练习2:存储过程和使用程序块更新数据 该练习将示范如何用数据访问应用程序调用存储过程,并使用强类型的DataSet来更新数据. 第一步 打开DataEx2.sln项目,默认的安装路径应该为C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\begin,并编译. 第二步 在QuickStarts数据库中添加Categories数据表 运行批处理文件SetUpEx0

【自然框架】之数据访问 —— 再小的类库也需要设计。

  以前也写过几篇关于数据访问的,这里是最新的总结.麻雀虽小五脏俱全,数据访问也许不起眼,但是也要好好的设计一翻.从2004年开始用自己的数据访问,一直到现在,经历过两次大的改版,随着需求的变化,也增加了不少的功能,小修小改那就更多了.目的就是能够让自己更轻松一点.整理思路.整理代码,写点东西,一个是给自己留个脚印:另外一个,说不定也许能够给大家帮个小忙.   目标: 简单.好用.易扩展.稳定.性能.   特点: 1. 基于ADO.net 2.0 编写,理论上可以支持多种数据库,目前测试了SQL

基于.NET平台的分层架构实战(九)—数据访问层的第三种实现:基于NBear框架

基于.NET平台的分层架构实战(九)-数据访问层的第三种实现:基于NBear框架的ORM实现 前面的文章讨论了使用SQL语句和存储过程两种数据访问层的实现方式,这一篇里,将讨论使用ORM方式实现数据访问层的方法. 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实

DataRabbit 轻量的数据访问框架(07) -- ISPAccesser

   (完全限定类名:DataRabbit.Relation.ISPAccesser)       虽然IRelationAccesser可以调用一些不含out参数的存储过程,但是在DataRabbit中调用存储过程最好是通过ISPAccesser接口来进行.   存储过程不仅可以有返回值,还可以有[in,out]参数,在对存储过程的调用进行封装之前,首先必须抽象存储过程的参数表示.DataRabbit使用SPParameter来表示存储过程的参数.   注意,Name属性表示参数名,该参数名不

DataRabbit 轻量的数据访问框架(05) -- ITableAccesser

   (完全限定类名:DataRabbit.Relation.ITableAccesser)       ORM并不能完成所有的事情,有些数据库访问还是需要基于关系来进行,对于那些不提供基于关系进行数据访问操作的纯ORM框架,我认为是不明智的.在DataRabbit中,基于ORM的访问和基于关系进行数据访问各占了一半的天空,这使得我们在无法用ORM达成的地方,可以转向使用基于关系的访问器来达成.DataRabbit.Relation命名空间下的类和接口用于提供基于关系的数据库访问操作,主要包括:

.net中的数据访问框架比较

Windows平台上数据访问技术飞速发展,在现在的项目中该如何选择合适的技术且该技术能有比较长的持续周期呢? 通过查询和汇总了网上的一些资料,希望能够为我们在开发中架构选型提供帮助. 发展方向 微软官方的一个说明. http://www.infoq.com/cn/news/2010/07/Top-10-Questions-on-Data http://msdn.microsoft.com/en-us/data/bb525059.aspx 微软宣称"会继续开发这些技术",但不会继续使用&

【自然框架】添加数据的思路和流程 —— 流水线式

      自然框架里面,添加数据的思路.流程:   1. 根据元数据绘制表单. 2. 用户看到表单后就可以录入数据了. 3. 在前台使用正则来做验证. 4. 通过后提交给后台. 5. 本着提交过来的数据都不可信的原则,在后台还要再次进行验证. 6. 验证合格后,设置一个中断点.请注意这一步. 7. 根据元数据,拼接成参数化的SQL,以及存储过程的参数,再根据用户输入的数据设置参数值. 8. 都准备好了之后就可以通过ADO.net提交给数据库了.   以上看似步骤很多,其实除了第六步之外,都是自

SOA数据访问:使用LINQ To SQL和实体框架实现灵活的数据访问

本文配套源码 本文使用以下技术: LINQ to SQL.ADO.NET实体框架和SOA 目录 创建数据访问层 持久化各个对象 跨服务边界跟踪更改 配置客户端 总结 迄今为止,Microsoft 已面向开发人员发布了两种旨在减少关系数据领域和面向对象的编程之间 的阻抗失谐的产品:LINQ to SQL 和 ADO.NET 实体框架.借助其中任何一种产品,您不必编写大部分探 测代码,即可实现对象持久性.但是,将这些对象关系映射 (ORM) 技术应用到面向服务的应用程序体系 结构为应用程序开发人员带