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 数据库关系图
创建了文件并拖动了相应的数据库关系图后,就可以保存并编写相应的代码进行查询了,示例代码如下所示。
{
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类,示例代码如下所示。
Initial Catalog=student;Persist Security Info=True;User ID=sa;Password=sa");//建立连接
上述代码通过DataContext类进行数据连接。当数据库连接后,就可以获取数据库相应的表显示数据,示例代码如下所示。
{
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类文件或者自己创建连接字串。示例代码如下所示。
{
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)将更改提交到数据库。
上面三个步骤就能够实现数据的修改更新,示例代码如下所示。
{
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所示。
图21-25 更新xixi为xixi2
21.5.5 删除数据
使用LINQ能够快速的删除行,删除行的基本步骤如下所示。
1)在数据库的外键约束中设置 ON DELETE CASCADE 规则。
2)使用自己的代码首先删除阻止删除父对象的子对象。
只需要上面两个步骤就能够实现数据的删除,示例代码如下所示。
{
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的元素,以保持数据库约束,示例代码如下所示。
{
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();//更新删除
}
}
当数据库包含外键,以及其他约束条件时,在执行删除操作时必须小心进行,否则会破坏数据库约束,也有可能抛出异常。
加支付宝好友偷能量挖...