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


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

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

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

  • 相关阅读:
    mysql中in 做条件匹配 带逗号的字符串 数据异常解决
    [LeetCode] Kth Largest Element in a Stream 数据流中的第K大的元素
    [LeetCode] Binary Search 二分搜索法
    [LeetCode] Search in a Sorted Array of Unknown Size 在未知大小的有序数组中搜索
    [LeetCode] Insert into a Binary Search Tree 二叉搜索树中插入结点
    [LeetCode] Search in a Binary Search Tree 二叉搜索树中搜索
    [LeetCode] Design Circular Deque 设计环形双向队列
    [LeetCode] Design Circular Queue 设计环形队列
    [LeetCode] N-ary Tree Preorder Traversal N叉树的前序遍历
    [LeetCode] 589. N-ary Tree Postorder Traversal N叉树的后序遍历
  • 原文地址:https://www.cnblogs.com/jyk/p/2037294.html
Copyright © 2020-2023  润新知