本文章主要介绍SqlHelper使用。
 每个项目都要用到数据访问层,我做的也不例外,但是我把数据访问层做成独立项目,没有什么太大的目的,数据访问层,仅仅做数据访问用,不包含任何逻辑。
 为什么要使用数据访问层?
 如果不使用数据访问层,那么你的代码里会出现很多SqlConnection、SqlCommand、SqlDataReader、Open、 Close……这些类和方法,而且代码量很大,让你不胜其烦,而且代码写起来,其实都是体力活,没有技术含量。因此我们要把数据访问层封装起来,方便重用。微软已经替我们做好了这个工作,那就是SqlHelper,下图是SqlHelper的类关系图:
 下面介绍我的使用方法。
 执行一个无返回值的存储过程:
 create proc p_Delete@id int
as
delete table1 where id=@id 这是一个删除数据的存储过程,调用该存储过程只需要一句话:SqlHelper.ExecuteNonQuery (SqlHelper.conn, "p_Delete", id);,这里的id是int类型,而不是SqlParameter类型。该调用是调用的public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)方法。以此类推。返回一个DataSet类型:SqlHelper.ExecuteDataset (SqlHelper.conn, pro, 参数列表);参数也是直接传递,无需构造SqlParameter……好了,本文主要是介绍一个小技巧,就是params object[]的使用方法,让高手见笑了出处:数据访问层SqlHelper的使用大家觉得这么做有没有什么坏处?

解决方案 »

  1.   


    无知。
    跟到函数里面看看在说,
    public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
      

  2.   

    实际上SQLHelper里面使用的也是参数化的思想,在这个类的很多方法里面都有SqlParameter的身影,所以,楼主的标题?
      

  3.   

    只是他把SqlParamter[]换成了Object[],这样传值更准确,只能说SqlHelper封装的更好而已.
      

  4.   

    我发本贴的目的是告诉一些网友(姑且称之为菜鸟吧),SqlHelper可以这么用,不要再自己new Sqlparameter实例了。太麻烦了,还要设置参数类型,长度,值。
    大家不信可以在论坛里搜索下,看有多少使用SqlHelper的,还在new SqlParameter,我是看到了这么用很麻烦,不知道直接调用object的有什么不妥。
      

  5.   

    肯定new SqlParameter效率要高些. 省得SqlHelper类再进行一次封箱拆箱的过程(貌似是这么个说法吧)
      

  6.   

    sqlhelper ~@~!~@
    n年前就有了啊,怎么。
      

  7.   

    SqlHelper不过时吗?玩具类...学生用还差不多...去看看Linq吧...就算还没升级到3.5也应该去看看Enterprise Library...
      

  8.   

    1、params object[]有没有防注入的功能?
    2、装箱,拆箱在参数比较多时会不会影响效率?
      

  9.   

    暈,SqlHelper裡面難道就不使用SqlParameter嗎?
      

  10.   

    微软很少推SqlHelper,他是在推另一个封装的数据库访问层 企业类库(Enterprise Library )
    SqlHelper他只针对sql连接,比较难扩展,但是企业类库却能很好的根据配置文件来使用不同的连接方式,而且提供的接口也更灵活
    建议你也去看看企业类库,做一下比较。
      

  11.   

    防注入肯定有。装箱拆箱如果传递SqlParameter也是需要的,所以从这个角度说应该没区别。
      

  12.   

    如果要写的漂亮 或者面向对象 或者编译时类型检查 还是ORM 才是王道SqlHelper 这个用的人多的和米一样...
    不过确实比较实用 轻量 简单 稳定另外......居然发0分贴~!!
      

  13.   

    忽然想起Linq  让写法更优雅 编译时检查更完善
      

  14.   

    不知外面的人是否都用这个SqlHelp
      

  15.   

    这就是钻牛角尖了。
    微软出了c#,那他为什么不用c#来开发vs2005?是不能实现吗?我觉得更多的应该是保护现有投资。
      

  16.   

    使用.net开发vs,技术没问题,但是运行效率呢?
    对于开发工具而言,性能很重要,目前的VS IDE的性能已经让很多人不满意了。
    相对于传统的win32开发工具语言,.net做windows开发运行效率稍低一些,耗内存更多一些,这是无法否认也不得不面对的问题。因为至少在现在来讲,CPU和内存仍然是有瓶颈的。
      

  17.   

    微软,以及一些技术专家都对性能问题表示:.net的性能不一定输于传统的c++,vb等编译好的程序。
    是不一定,不是说.net开发的新能就差。
      

  18.   

    呵,我不是专家。但是我可以肯定我用win32开发的windows程序会比我用.net开发的windows程序性能好,占内存小。
    至于微软以及某些专家的话,能全信吗?相信很多人有实际的体会。
    以后.net的性能会怎样,我不知道,但至少在目前,除了企业级开发之外,大部分领域还传统的win32开发工具占主导地位。
      

  19.   

    首先,一个软件系统是由一行一行的代接拼凑起来的,同样水平的人来开发,如果几行代码就有明显的效率差异,整个系统的效率不是更大吗?当然在我看来,几行代码的效率差异并不大,但代码多了,差异就明显了。
    另外,我很想问下,“微软,以及一些技术专家都对性能问题表示:.net的性能不一定输于传统的c++,vb等编译好的程序。”,他们有给过实际对比的范例吗?实际应用中,反例却不少。
      

  20.   

    不知道你有没有用过VC,BCB或者Delphi,即使VB6运行效率比起.net也不差的。
      

  21.   

    哗众取宠,你看看PETSHOP4.0用了多少SQLPARAMETER,晕死
      

  22.   

    兄弟,不是所有人都像你一样高手,很多菜鸟还不会的,我只是为了分享一下我的知识,我没有把它当成低级的东西,相反我觉得这个类特别适用,尤其是做中小网站、项目。做中小网站,最重要的就是开发效率。当然老板可能不希望你开发的太快,他希望要稳定,产品要好。才不会管你是否在加班写N个new SqlParameter呢
      

  23.   

    其实,楼主如果不用“SqlParameter已经过时”这种哗众取宠的标题,可能会比较受初学者欢迎呢。现在适得其反了。呵呵。
      

  24.   

    Enterprise Library是最佳实践,而不是理论,是对很多有影响力的软件企业通过多年的开发实践积累下来的技术的整合。 
      

  25.   

    直接执行一句sql就可以了,如果照楼主的说法 "exec p_Delete "+id.ToString() 应该效果也一样
      

  26.   

    支持小灰
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  27.   

    .net  c++ 有些情况下性能是差不多
    例如性能主要取决于IO 或者是网络的时候更多的时候性能取决于解决方案  写代码人的水平 而不是语言当然如果你要用.net开发3d游戏那肯定是顶不住了
    注: 主要不是因为性能问题 现在的机器性能都跑的动  关键是.net的垃圾回收会导致一定时间的无响应VB那丫的性能并不好
      

  28.   

    .NET的优势不是性能而是开发效率...真正考虑性能的应用不会指望.NET...至少目前还是如此....NET的应用领域是企业应用所以更注重工程方法而不是局部性能...使用工具得先搞清楚工具用在什么地方才能发挥其最大效能...
      

  29.   

    这句我喜欢,呵呵,真的,用类似于在数据库的“企业管理器里执行存储过程”这种代码,就exec 一下存储过程,后面跟着参数,就是为了省事。而且是超级省事的。如果不用代码生成工具,我觉得似乎不能再更加省事了。
      

  30.   

    唉,都说得我一头雾水,嗯,ORM有没有可以推荐的,或者谁有资料???麻烦指点一下
      

  31.   

    說是沒用的,不如寫個範例給我看看,讓我知道.net  c++ 有些情况下性能是差不多的(包括內存和CPU以及執行速度的衡量)?
    因為我沒有辦法寫出來,所以我肯定的認為傳統win32的運行效率超出.net。實話說,我感覺說.net和傳統win32開發工具(特別是vc)性能差不多的人,80%以上沒有真正做過win32開發。大多數衹是在安慰自己而已。
    誠如vrhero 所說:“使用工具得先搞清楚工具用在什么地方才能发挥其最大效能”
      

  32.   

    好像没有什么意思。都是一样的。
    是个C# asp.net 的人都知道sqlhelper.cs
      

  33.   

    使用SqlHelper确实可以省去书写代码的劳动力,但并不代表SqlHelper不使用SqlParmameter。只不过又在原来层次上多封装了一层。让我们更方面调用。至于性能,我想装箱和拆箱操作会不会多一层的浪费。呵呵,没测试过不好说。
    不过下次用的时候我会用SqlHelper的。
      

  34.   

    汗,我一直在用!----------------------------------
    中国无忧商务网-无忧商务 商务无忧
    www.cn5135.com
      

  35.   

    那位帮忙看看Sqlhelper里的这个问题
      

  36.   

    汗,链接成了链接的链接了看这里:SQLHelper问题:克隆SqlParameter和创建SqlParameter的速度问题。
      

  37.   

    楼主,你为什么不早发这贴呢!
    害得我SqlParameters很长一段时间,决定从此告别SqlParameters
      

  38.   

    汗哦,我一年多以前就一直就sqlhelper了,没想到还真有这么多还还在用sqlparameters,多麻烦呀
      

  39.   

    Object 代替Parameters 没什么不好。但是可能存在一个 系统内部隐式转换 会影响 数据访问层使用的数据库例如 sql server 中有字段定义为 char(50),这个时候,使用消费者传入 Object[]中的类型为string,但是实际上framework会将string 转换为nvarchar类型。如果这个是用于查询的,那么,这样会直接导致 查询索引方式实效。如果以前使用的命中方式是 索引定位,那么回变成索引扫描
      

  40.   

    用object的不妥就是boxing和unboxing带来的开销问题,是不是支持泛型就好多了呢
    sqlhelper内部封装了sqlparameter,我们使用方便多了
      

  41.   

    我也是用的微软的sqlhelp,挺好用的