且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

更新时间:2022-02-10 17:02:34

    用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。

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图1.1 数据库

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图1.2 Item表

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图1.3 ItemIn表

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

 

图1.4 ItemOut表

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

1.2 界面设计

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图1.5 选择对话框

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图1.5 Item窗体

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

2 系统实现

2.1 数据

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

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.1 新建LINQ to SQL类

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.2 添加数据库链接

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.3 test.dbml

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

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例app.config
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例xml version="1.0" encoding="utf-8" ?>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
<configuration>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
<configSections>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
configSections>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
<connectionStrings>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
<add 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
name="MyLinq.Properties.Settings.testConnectionString" 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    connectionString
="Data Source=chenliang1;Initial Catalog=test;Integrated Security=True"
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        providerName
="System.Data.SqlClient" />
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
connectionStrings>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
configuration>


2.2
实体类

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.4 添加新数据源

    2. 选择对象作为数据源

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.5 选择对象

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.6 选择实体类

    4. 绑定到窗体

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

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图2.7 绑定到窗体

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

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

          var query = from c in ccc

                          where c>5

                          select c

                          ......

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

2.3 后台

窗体方法类Methods.cs

 

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例Methods
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例using System;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Transactions;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Collections.Generic;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Linq;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Text;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Data.Linq;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Windows.Forms;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using MyLinq.ORM;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
namespace MyLinq.MyMethod
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/// 泛型类,对窗体进行操作的方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/// 传入操作类型,此处具体为映射到数据库表的类
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    class Methods<TbeToOpe>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
私有变量#region 私有变量
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 实例化数据库映射对象
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        static testDataContext data = new testDataContext();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
#endregion

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
窗体操作方法#region 窗体操作方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 根据传入的泛型类得到指定类型的所有集合,作为数据源返回
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 指定类型的集合的数据源
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        public ITable GetDataSource()
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
return data.GetTable(typeof(TbeToOpe));
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 窗体批量操作方法,在事务中操作数据库,实现批量操作
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        public void DoChange()
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
//实例化一个事物对象,在对象范围内的行为可以回滚
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
            using (TransactionScope ts = new TransactionScope())
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
try
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    
//判断用户是否进行了更改,更改内容包括增、删、改
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                    if (HasUpdate() == true)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
//选择对话框
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                        if (MessageBox.Show("确定执行对数据库的操作吗?""确定操作",
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                            MessageBoxButtons.OKCancel, MessageBoxIcon.Question) 
== DialogResult.OK)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                            
//提交对对象的更改到数据库,实现实体/数据库的同步
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                            data.SubmitChanges();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                            MessageBox.Show(
"对数据库的操作成功!""操作成功!", MessageBoxButtons.OK, MessageBoxIcon.Information);
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
//捕捉异常
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                catch (Exception ex)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    MessageBox.Show(ex.Message, 
"操作失败", MessageBoxButtons.OK, MessageBoxIcon.Information);
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
//事务结束
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                ts.Complete();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 窗体的关闭事件
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 窗体行为参数
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        public void FormsClosing(FormClosingEventArgs e)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
//实例化一个事物对象,在对象范围内的行为可以回滚
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
            using (TransactionScope ts = new TransactionScope())
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
try
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    
//判断用户是否进行了更改,更改内容包括增、删、改
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                    if (HasUpdate() == true)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
//对话框,窗体关闭时是YesNoCancel对话框
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                        DialogResult dr = MessageBox.Show("确定保存对数据库的操作吗?""退出提示",
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                           MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
if (dr == DialogResult.Yes)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                            
//提交对对象的更改到数据库,实现实体/数据库的同步
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                            data.SubmitChanges();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
else if (dr == DialogResult.Cancel)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                            
//点击取消,则不关闭窗体
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                            e.Cancel = true;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
//异常提示信息
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                catch (Exception ex)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    e.Cancel 
= true;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                    MessageBox.Show(ex.Message, 
"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
//事务结束
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
                ts.Complete();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 判断实体是否有变化,并返回变化集的数量
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 变化的数量,为增、删、改的总和
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        private bool HasUpdate()
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
if (data.GetChangeSet().Deletes.Count + data.GetChangeSet().Inserts.Count +
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                data.GetChangeSet().Updates.Count 
> 0
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例                
return true;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
return false;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
#endregion

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例}

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

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

Item窗体:

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例Item
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例using System;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Collections.Generic;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.ComponentModel;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Data;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Data.Linq;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Drawing;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Linq;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Text;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using System.Windows.Forms;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using MyLinq.MyMethod;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
using MyLinq.ORM;
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
namespace MyLinq
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/// Item窗体,对应操作数据库表Item
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    public partial class ItemForm : Form
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
字段、私有变量#region 字段、私有变量
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 实例化窗体操作泛型类,传入Item
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        Methods<Item> MethodsItem = new Methods<Item>();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
#endregion

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
构造函数、窗体加载方法#region 构造函数、窗体加载方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 构造函数
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        public ItemForm()
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            InitializeComponent();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 窗体加载方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        private void Form1_Load(object sender, EventArgs e)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            itemBindingSource.DataSource 
= MethodsItem.GetDataSource();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
#endregion

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
窗体方法#region 窗体方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 点击“Go”按钮,进行一键式的数据库操作
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        private void buttonGo_Click(object sender, EventArgs e)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            MethodsItem.DoChange();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
//重新绑定数据源
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
            itemBindingSource.DataSource = MethodsItem.GetDataSource();
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/**//// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 窗体关闭方法
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
/// 
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例{
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例            
//关闭窗体
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
            MethodsItem.FormsClosing(e);
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例        
#endregion

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例    }

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例}

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

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

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

2.4 实体类属性

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

图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对于开发中小企业项目来说仍不失为一个不错的选择。