zoukankan      html  css  js  c++  java
  • 艾伟_转载:LINQ to SQL、NHibernate比较(二) LINQ to SQL实例 狼人:

        用ADO.NET操作数据库大家一定再熟悉不过了,select、insert、update等等SQL语句大家也都必然滚瓜烂熟。我将自己在学习LINQ to SQL过程中的动手经历记录下来,作为今后学习的参考,也希望对刚刚接触的人有一点帮助。

        我在本文涉及到一个很简单的系统,利用DataGridView实现数据库数据的批量增、删、改,不是什么强大的功能。

        如果有人感兴趣,可以在看完我的这篇文章之后用ADO.NET实现同样的功能,看看到底会比使用LINQ to SQL多多少时间,会多多少代码。(从设计到完成我用时大概2小时,代码量后面介绍中我会贴出我的代码)我相信很多人编码能力比我强很多,大家可以试试。总之尝试了LINQ to SQL我暂时没有用ADO.NET的想法。

        (程序在Windows Server 2003、VSTS 2008、SQL Server 2005下完成)。 
          源码下载/Files/chenl861004/MyLinq.rar
    1 什么系统?

    1.1 数据库

        先来看看数据库的设计,数据库名为test,作为简单系统的测试用数据库,test数据库含有三个表,Item、ItemIn和ItemOut。

    clip_image002

    图1.1 数据库

    clip_image004

    图1.2 Item表

    clip_image006

    图1.3 ItemIn表

    clip_image008

    图1.4 ItemOut表

        数据库再简单不过了,三个表也完全雷同,不过建立三个表其实是为了后面说明使用LINQ to SQL结合泛型操作类实现可扩展性是很方便的。

    1.2 界面设计

        程序运行时首先弹出选择对话框,点击不同按钮弹出相应的界面就可以对相应的数据库表进行操作了。

    clip_image010

    图1.5 选择对话框

        这是操作界面,三个表对应的操作界面相同,就只贴出Item窗体:

    clip_image012

    图1.5 Item窗体

        窗体含有一个TableLayoutPanel控件,将窗体成上下两部分,上面是DataGridView控件,下面有个“Go”按钮,DataGridView显示持久化了的数据,点击Go将变化提交到数据库。DataGridView启用了“编辑”“添加”和“删除”,可在上面任意操作,操作完成后批量提交。

    2 系统实现

    2.1 数据

        系统实现的讲解还是从数据的角度开始吧,使用LINQ to SQL的时间到了。

        1.右键单击项目或其子文件夹->添加->添加新项->LINQ to SQL类,取名为test,扩展名是dbml。如此建立好了数据库对应的实体类。

    clip_image014

    图2.1 新建LINQ to SQL类

        2.打开服务器资源管理器,右键点击空白处->添加链接… 这就出现了我们经常见到的链接数据库的对话框

    clip_image016

    图2.2 添加数据库链接

        3.双击打开 test.dbml文件,将test从服务器资源管理器中将test数据库的表拖入到test.dbml中,这样数据库实体类就完成了,很快捷。

    clip_image018

    图2.3 test.dbml

        事实上,不仅可以拖入表,还能拖入试图,存储过程等,存储过程在实体类中被设计成了一个一个方法,只需要传入参数就行,参数即对应了我们之前的@A,@B等,十分方便。

        同时,可以看到生成了一个文件,这是Xml文件,如果以后相对数据库进行配置,就在这里进行。

    app.config


    2.2
    实体类

        1. 在数据源中右键点击添加新数据源

    clip_image020

    图2.4 添加新数据源

        2. 选择对象作为数据源

    clip_image022

    图2.5 选择对象

        3.选择实体类,每个实体类对应了数据库中的一个表

    clip_image024

    图2.6 选择实体类

        4. 绑定到窗体

        将数据源的实体类拖动到右边的窗体,则会自动产生DataGridView控件BindingSource控件和BindingNavigator控件,BindingNavigator此处没有用到,可以删除。

    clip_image026

    图2.7 绑定到窗体

        拖动过去之后数据源连接我们可以不用管,已经为我们完全做好了,如果不想用DataGridView控件,则也可以自己设计,不过此处由于要实现批量增、删、改,DataGridView是最佳选择。

        使用这种方式,而不是手动改变实体的值有很大的好处,我们完全可以不用关心查询、修改、更新语句,这里的“查询、修改、更新语句”,不是指SQL语句,而是LINQ语句。是的,我们在这个系统里面不会看见类似于

              var query = from c in ccc

                              where c>5

                              select c

                              ......

    的语句,因为DataGridView帮我们完成了(复杂功能的系统另当别论),这样我们只要完成了一个方法类,只需传入一个参数,告诉这个方法类我要操作那个表,那么我们甚至能在一下午作出几百个窗体来,而且我们只需要维护这个方法类就能维护所有的窗体。

    2.3 后台

    窗体方法类Methods.cs

    Methods

        Methods类包含了处理窗体事件的方法我们在窗体代码中调用即可,下面是Item窗体代码。

    Item窗体:

    Item

        其他两个窗体代码类似于Item,由此可见,窗体中只需调用Methods类中的相应方法,就可以实现所有需要的功能,并且只用传递一个泛型参数即可,无需每个窗体都写不同的数据库操作语句,并且利用添加数据源的方式,等同于在LINQ to SQL层和业务层又建立了一个中间层,使得我们甚至连LINQ to SQL的InsertToSubmit等方法的调用都省略。因为前台的DataGridView会根据我们对它的每次操作自动调用相应的增、删、改方法对内存中的实例对象类进行修改,一旦调用了SubmitChanges后才全部提交。

        (关于LINQ to SQL到底有哪些使用的方法,请参看LINQ to SQL、NHibernate比较(一)-- LINQ和NHibernate初体验

    2.4 实体类属性

    clip_image028

    图2.8 实体类属性

        我们也可以在test.designer.cs中修改实体类属性的一些规则,比如我修改了ItemIn入库时间必须在1753-1-1 12:00:00和9999-12-31 11:59:59之间,这是根据SQL Server数据库来设置的。这样前台的DataGridView就不会接受越界的值。

    3.小结

        本文通过记录自己在学习LINQ to SQL过程中的一个简单例子,分析了基于LINQ to SQL作为数据库持久层的MIS系统的实现,虽然功能很简单,但是已经初窥可以感到LINQ to SQL给我们带来的方便。

        试想如果这个系统是直接用ADO.NET实现,那么远不止这些代码,尤其是涉及到批量操作上面,我们需要判断DataGridView那些行进行了修改,添加了哪些行,删除了哪些行。开发时间将会变长,出错的几率也会变大,同时如果窗体较多,每个窗体都要设计相对独立的SQL语句,扩展很不方便,维护成了难题,LINQ to SQL默默地为我们完成了很多工作。

        微软下一代ORM方案ADO.NET Entity Framework已经出现,并且随着VS2010和.NET 4.0的发布应该现在比较完善了,不过LINQ to SQL对于开发中小企业项目来说仍不失为一个不错的选择。

  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/waw/p/2157131.html
Copyright © 2011-2022 走看看