02DataContext与实体的增删改查
- 格式:doc
- 大小:252.00 KB
- 文档页数:9
02 DataContext与实体增删改查知识点DataContextDataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方法和把实体的修改写入数据库。
DataContext提供了以下一些使用的功能:以日志形式记录DataContext生成的SQL执行SQL(包括查询和更新语句)创建和删除数据库DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体。
定义实体类using System.Data.Linq.Mapping;[Table(Name = "Student")]public class Student{//StudentNo, StudentName, Age, Address, GradeId[Column(IsPrimaryKey=true)]public int StudentNo { get; set; }[Column]public string StudentName { get; set; }[Column]public int Age { get; set; }[Column]public string Address { get; set; }[Column]public int GradeId { get; set; }}以Myshool数据库为例,上述Student类被映射成一个表,对应数据库中的Student表。
然后在类型中定义了五个属性,对应表中的五个字段。
其中,StudenNo字段是主键,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说实体类的属性名就需要和数据表中的字段名一致。
现在,创建一个WinForm程序,然后在窗体上上加入一个DataGridView控件,使用下面的代码进行绑定数据:using System.Data.Linq;DataContext dct = new DataContext("server=.;database=net3;integrated security=sspi");Table<Student> tb= dct.GetTable<Student>();dataGridView1.DataSource =from c in tb select new{学号=c.StudentNo,学生姓名=c.StudentName,年龄=c.Age};使用DataContext类型把实体类和数据库中的数据进行关联。
你可以直接在DataContext的构造方法中定义连接字符串,也可以使用IDbConnection:using System.Data.SqlClient;IDbConnection conn = new SqlConnection("server=.;database=net3;integrated security=sspi");DataContext ctx = new DataContext(conn);之后,通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Student表的实体是Student类型。
随后的查询句法,即使你不懂SQL应该也能看明白。
从Customers表中找出记录,并把StudentNo、StudentName以及Age封装成新的匿名类型进行返回。
结果如下图:强类型DataContextpublic partial class MySchoolDataContext : DataContext{public Table<Student> Students;public MySchoolDataContext(IDbConnection connection) : base(connection) { }public MySchoolDataContext(string connection) : base(connection) { }}强类型数据上下文使代码更简洁:MySchoolDataContext ct = new MySchoolDataContext ("server=.;database=net3;integrated security=sspi "); dataGridView1.DataSource =from c in ct. Students select new{学号=c.StudentNo,学生姓名=c.StudentName,年龄=c.Age};DataContext其实封装了很多实用的功能,下面一一介绍。
日志功能using System.IO;MySchoolDataContext ctx = MySchoolDataContext ("server=.;database=net3;integrated security=sspi "); StreamWriter sw = new StreamWriter("c:\\lognet.txt"), true); // Appendctx.Log = sw;dataGridView1.DataSource =from c in ct. Students select new{学号=c.StudentNo,学生姓名=c.StudentName,年龄=c.Age};sw.Close();运行程序后在网站所在目录生成了log.txt,每次查询都会把诸如下面的日志追加到文本文件中:SELECT [t0].[CustomerID], [t0].[ContactName], [t0].[City]FROM [Customers] AS [t0]WHERE [t0].[CustomerID] LIKE @p0-- @p0: Input String (Size = 2; Prec = 0; Scale = 0) [A%]-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1应该说这样的日志对于调试程序是非常有帮助的。
探究查询using mon;using System.Collections.Generic;MySchoolDataContext dct = new MySchoolDataContext("server=.;database=net3;integrated security=sspi");StreamWriter sw = new StreamWriter("c:\\lognet.txt", false);dct.Log = sw;var select = from c in dct.Student where c.StudentName.StartsWith("张") && c.GradeId==1 select new { 学号= c.StudentNo, 学生姓名= c.StudentName, 年龄= c.Age, 年级= c.Grade.GradeName };IDbCommand com= dct.GetCommand(select);//读取刚才select发送的sql语句textBox1.Text+= mandText+"\r\n";//读取参数foreach (DbParameter sp in com.Parameters){textBox1.Text +=string.Format("Name={0},Value={1}\r\n",sp.ParameterName,sp.Value);}//从里面读取一条数据Student st= dct.Student.First();st.StudentName = "张顶天";dct.SubmitChanges();sw.Close();在这里,我们通过DataContext的GetCommand方法获取了查询对应的DbCommand,并且输出了CommandText 和所有的DbParameter。
之后,我们又通过GetChangeSet方法获取了修改后的实体,并输出了修改内容。
执行查询(批量更新,批量删除ORM框架效率都不高,建议使用T-SQL进行修改,删除)MySchoolDataContext dct = new MySchoolDataContext("server=.;database=net3;integrated security=sspi");StreamWriter sw = new StreamWriter("c:\\lognet.txt", false);dct.Log = sw;IEnumerable<Student> lst = dct.ExecuteQuery<Student>("select * from student where GradeId={0}", 1);sw.Close();List<Student> lst1= lst.ToList();dataGridView1.DataSource =lst1;前一篇文章已经说了,虽然Linq to sql能实现90%以上的TSQL功能。
但是不可否认,对于复杂的查询,使用TSQL能获得更好的效率。
因此,DataContext类型也提供了执行SQL语句的能力。
代码的执行结果如下图:创建数据库(同时可以把对应的DataContext里面的表也进行创建)testContext dct = new testContext("server=.;database=everybody;integrated security=sspi");dct.CreateDatabase();[Table(Name = "test")]public class test{[Column(IsPrimaryKey = true, IsDbGenerated = true)]public int ID { get; set; }[Column(DbType="varchar(20)")]public string Name { get; set; }}public partial class testContext : DataContext{public Table<test> test;public testContext(string connection) : base(connection) { }}这段代码在数据库中创建了名为testdb的数据库,等同于下面的脚本:CREATE TABLE [dbo].[test]([ID] [int] IDENTITY(1,1)NOT NULL,[Name] [varchar](20)COLLATE Chinese_PRC_CI_AS NULL,CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED([ID] ASC)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY])ON [PRIMARY]同时,DataContext还提供了DeleteDatabase()方法,在这里就不列举了。