21.5 使用LINQ查询和操作数据库

  讲解了关于LINQ的基本知识,就需要使用LINQ进行数据库操作,LINQ能够支持多个数据库并为每种数据库提供了便捷的访问和筛选方案,本书主要使用SQL Server 2005作为数据源进行LINQ查询和操作数据示例数据库。

21.5.1 简单查询
  LINQ提供了快速查询数据库的方法,这个方法非常的简单,在前面的章节中已经讲到,这里使用21.1.1中准备的student数据库作为数据源,其表结构和数据都已经创建完毕,只需要进行简单查询即可。首先创建一个LINQ to SQL文件,名称为MyLinq.dbml,并将需要查询的表拖动到视图中,这里需要拖动Class表和Student表作为数据源,如图21-22所示。
数据库关系图
图21-22 数据库关系图
  创建了文件并拖动了相应的数据库关系图后,就可以保存并编写相应的代码进行查询了,示例代码如下所示。

+展开
-C#
        protected void Page_Load(object sender, EventArgs e)
        {
            MyLinqDataContext dc = new MyLinqDataContext();//创建对象
            var StudentList = from d in dc.Student orderby d.S_ID descending select d;//执行查询
            foreach (var stu in StudentList)//遍历元素
            {
                Response.Write("学生姓名为" + stu.S_NAME.ToString()+"<br/>");//输出HTML字串
            }
        }

  上述代码直接使用LINQ to SQL文件提供的类进行数据查询和筛选,运行后如图21-23所示。
简单查询
图21-23 简单查询
  查询的原理很简单,在21.1.1中就已经讲解了如何创建LINQ的Web应用,但是那个时候并没有涉及到LINQ查询子句,现在回过头再看就会发现其实使用LINQ进行数据库访问也并不困难,这里不再作过多解释。

21.5.2 建立连接
  上一节中讲解了使用LINQ快速的建立数据库之间的连接。在LINQ to SQL中,.NET Framework同样像ADO.NET一样为LINQ提供了LINQ数据库连接类和枚举用于自定义数据连接。建立与SQL数据库的连接,就需要使用DataContext类,示例代码如下所示。

+展开
-C#
DataContext db = new DataContext("Data Source=(local);
Initial Catalog=student;Persist Security Info=True;User ID=sa;Password=sa");//建立连接

  上述代码通过DataContext类进行数据连接。当数据库连接后,就可以获取数据库相应的表显示数据,示例代码如下所示。

+展开
-C#
        protected void Page_Load(object sender, EventArgs e)
        {
            DataContext db = new DataContext("Data Source=(local);
            Initial Catalog=student;Persist Security Info=True;User ID=sa;Password=sa");//建立连接
            try
            {
                Table<Student> stu = db.GetTable<Student>();//获取相应表的数据
                var StudentList = from d in stu orderby d.S_ID descending select d;//执行LINQ查询
                foreach (var stud in StudentList) //遍历集合
                {
                    Response.Write("学生姓名为" + stud.S_NAME.ToString() + "<br/>");//输出对象
                }
            }
            catch
            {
                Response.Write("数据库连接失败"); //抛出异常
            }
        }

  上述代码使用DataContext类进行了数据库连接的建立,建立连接后可以使用Table类获取数据库中的表并填充数据到表里面,这样就无需像ADO.NET一样首先建立连接、然后再填充数据集这样进行繁冗的数据操作。开发人员可以直接使用LINQ查询语句对数据进行筛选。

21.5.3 插入数据
  创建了DataContext类对象之后,就能够使用DataContext的方法进行数据插入、更新和删除操作。相比ADO.NET,使用DataContext对象进行数据库操作更加方便和简单。使用LINQ to SQL类进行数据插入的操作步骤如下。
1)创建一个包含要提交的列数据的新对象。
2)将这个新对象添加到与数据库中的目标表关联的 LINQ to SQL Table 集合。
3)将更改提交到数据库。
  上面三个步骤就能够实现数据的插入操作,对数据库的连接可以使用LINQ to SQL类文件或者自己创建连接字串。示例代码如下所示。

+展开
-C#
        public void InsertSQL()
        {
            Student stu = new Student { S_NAME="xixi",C_ID=1,S_CLASS="0502" };//创建一个数据对象
            MyLinqDataContext dc = new MyLinqDataContext();//创建一个数据连接
            dc.Student.InsertOnSubmit(stu);//执行插入数据操作
            dc.SubmitChanges();//执行更新操作
        }

  上述代码使用了前面创建的LINQ to SQL类文件MyLinq.dbml,使用该类文件快速的创建一个连接。在LINQ中,LINQ模型将关系型数据库模型转换成一种面向对象的编程模型,开发人员可以创建一个数据对象并为数据对象中的字段赋值,再通过LINQ to SQL类执行InsertOnsubmit方法进行数据插入就可以完成数据插入,运行后如图21-24所示。
插入数据
图21-24 插入数据
  使用LINQ进行数据插入比ADO.NET操作数据库使用的代码更少,而其思想更贴近了面向对象的概念。

21.5.4 修改数据
  LINQ对数据库的修改也是非常的简便的,执行数据库中数据的更新的基本步骤如下所示。
1)查询数据库中要更新的行。
2)对得到的 LINQ to SQL 对象中的成员值进行所需的更改。
3)将更改提交到数据库。
  上面三个步骤就能够实现数据的修改更新,示例代码如下所示。

+展开
-C#
        public void UpdateSQL()
        {
            MyLinqDataContext dc = new MyLinqDataContext();
            var element = from d in dc.Student where d.S_ID == 4 select d;//查询
            foreach (var e in element)//遍历集合
            {
                e.S_NAME = "xixi2";//修改值
                e.S_CLASS = "0501";//修改值
            }
            dc.SubmitChanges(); //更新
        }

  在修改数据库中一条数据之前,必须要查询出这个数据。查询可以使用LINQ查询语句和where子句进行筛选查询,也可以使用Where方法进行筛选查询。筛选查询出数据之后,就能够修改相应的的值并使用SunmitChanges()方法进行数据更新,运行后如图21-25所示。
更新xixi为xixi2
图21-25 更新xixi为xixi2

21.5.5 删除数据
  使用LINQ能够快速的删除行,删除行的基本步骤如下所示。
1)在数据库的外键约束中设置 ON DELETE CASCADE 规则。
2)使用自己的代码首先删除阻止删除父对象的子对象。
  只需要上面两个步骤就能够实现数据的删除,示例代码如下所示。

+展开
-C#
        public void DeleteSQL()
        {
            MyLinqDataContext dc = new MyLinqDataContext();//连接数据源
            var del = from d in dc.Student where d.S_ID == 4 select d;//查询要删除的行
            foreach (var e in del)//遍历集合
            {
                dc.Student.DeleteOnSubmit(e);//执行删除操作
            }
        }

  上述代码使用LINQ执行了数据库删除操作,运行后如图21-26所示。
删除数据
图21-26 删除数据
  在进行数据中表的删除过程时,有些情况需要判断数据库中表与表之间是否包含约束关系,如果包含了子项,首先必须删除子项否则不能删除父项。例如在删除Class表时,在Student表中有很多项都包含Class表的元素,例如C_ID等于1的元素,当要删除Class表中C_ID为1的元素时,就需要先删除Student表中包含C_ID为1的元素,以保持数据库约束,示例代码如下所示。

+展开
-C#
        public void DeleteSQL()
        {
            MyLinqDataContext dc = new MyLinqDataContext();
            var delf = from d in dc.Class where d.C_ID == 1 select d;//查询父表
            var del = from d in dc.Student from f in dc.Class where d.S_ID == 
            4 && f.C_ID==1&&d.S_ID==f.C_ID select d;//进行约束查询
            foreach (var e in del)//删除子表
            {
                dc.Student.DeleteOnSubmit(e);//删除对象
                dc.SubmitChanges();//更新删除
            }
            foreach (var f in delf)//删除父表
            {
                dc.Class.DeleteOnSubmit(f);//删除对象
                dc.SubmitChanges();//更新删除
            }
        }

  当数据库包含外键,以及其他约束条件时,在执行删除操作时必须小心进行,否则会破坏数据库约束,也有可能抛出异常。

评论(1)网络
阅读(118)喜欢(0)不喜欢(0)asp.net-linq