LINQ to SQL 用于数据库连接的DataContext对象成员
本篇博文接上一篇,DataContext类位于System.Data.Linq.dll程序集中的System.Data.Linq名称空间下。在LINQ to SQL中负责实体对象和呢数据库之间的数据交换及其他数据库操作,还负责吧数据库中的数据映射成实体类的实例。
DataContext是LINQ to SQL操作实体类建立后紧接着需要操作的对象。本文总结其常用函数和属性的作用及常用用法,实体类是上一节的GuestInfo.cs类,数据库也采用上一节的数据库Database1.mdb,下面的示例程序对对象和属性按其功能进行了必要的分组,代码中也有详尽的注释。代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq; using System.IO; using System.Data.SqlClient; namespace DataContext对象成员 { /// <summary> /// 用于数据库连接的DataContext类成员 /// </summary> class Program { static void Main(string[] args) { //连接字符串 string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定义数据库和实体类\Database1.mdf;Integrated Security=True;User Instance=True"; //1.构造函数 DataContext dc = new DataContext(constring); //2.GetTable Table<GuestInfoEntity> table = dc.GetTable<GuestInfoEntity>(); var query = table.AsEnumerable(); foreach(var g in query) { Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel ); } Console.WriteLine("-----------------"); Console.ReadKey(); string fileName = @"E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定义数据库和实体类\Database1.mdf"; //3.DatabaseExists、DeleteDatabase、CreateDatabase if (dc.DatabaseExists()) { Console.WriteLine("数据库文件已经存在."); dc.DeleteDatabase(); } dc.CreateDatabase(); if (dc.DatabaseExists()) { Console.WriteLine("{0} 数据库文件创建成功.",Path.GetFileName(fileName )); } Console.WriteLine("-----------------"); Console.ReadKey(); //4_1.ExecuteCommand 作为LINQ补充直接用SQL指令操作数据库 dc.ExecuteCommand("insert into tb_GuestInfo(Name,Age,Tel) values({0},{1},{2})","DebugLZQ",25,"198****1336"); foreach (var r in dc.GetTable<GuestInfoEntity>()) { Console.WriteLine("{0} {1} {2} {3}",r.ID,r.Name,r.Age,r.Tel ); } Console.WriteLine("-----------------"); Console.ReadKey(); //4_2.ExecuteQuery 作为LINQ补充直接用SQL指令操作数据库 var rows= dc.ExecuteQuery<GuestInfoEntity>("select * from tb_GuestInfo"); foreach (var r in rows) { Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(); //4_3Translate 将DbReader转换为LINQ对象 string queryString = "select * from tb_GuestInfo"; SqlConnection connection = new SqlConnection(constring); SqlCommand cmd = new SqlCommand(queryString, connection); connection.Open(); var result = dc.Translate<GuestInfoEntity>(cmd.ExecuteReader());//ADO.NET转换LINQ foreach (var r in result) { Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel); } connection.Close(); Console.WriteLine("-----------------"); Console.ReadKey(); //5.SubmitChanges 应用修改 var firstrow = (from p in dc.GetTable<GuestInfoEntity>() select p).First(); firstrow.Name =firstrow.Name +"A"; dc.SubmitChanges();//应用修改 foreach (var r in dc.GetTable<GuestInfoEntity>() ) { Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(); //6.GetChangeSet方法 返回DataContext对象插入、删除、修改过的对象 ChangeSet cs = dc.GetChangeSet(); foreach (var r in cs.Updates ) { GuestInfoEntity t = r as GuestInfoEntity; Console.WriteLine("{0} {1} {2} {3}", t.ID,t.Name,t.Age,t.Tel ); } Console.WriteLine("-----------------"); Console.ReadKey(); //7.Refresh刷新实体对象 var row1=(from g in dc.GetTable<GuestInfoEntity>() select g).First(); row1.Age = row1.Age + 5; dc.SubmitChanges(); dc.Refresh(RefreshMode.OverwriteCurrentValues, row1);// foreach (var r in dc.GetTable<GuestInfoEntity>()) { Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel); } Console.WriteLine("7-----------------"); Console.ReadKey(); //ChangeConflicts属性 返回DataContext操作数据库时产生的并发冲突合集 //Transaction属性 设置或返回DataContext跟其他ADO.NET程序共享的事物对象 //ObjectTrackingEnabled属性 开启或关闭DataContext实体对象的状态跟踪 //8.Log属性 返回DataContext产生的SQL命令 dc.Log = Console.Out;//控制台输出DataContext产生的SQL语句 foreach (var r in dc.GetTable<GuestInfoEntity>()) { Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(); } } }
程序中的注释很详细,不再赘述。
程序的运行结果如下: