一、linq to sql技术概述
linq to sql 是 .net framework version 3.5 的一个组件,提供了用于将关系数据作为对象管理的运行时基础结构。
在 linq to sql 中,将关系数据库的数据模型,映射到一种对象模型中,该对象模型省指开发人员使用的编程语言表示的对象。通俗来讲,就是将数据库中的关系型数据,映射到代码里的实例对象。 当应用程序运行时,linq to sql 会将对象模型中的语言集成查询转换为 sql语句,然后将它们发送到数据库进行执行。 当数据库返回结果时,linq to sql 会将它们转换回你可以用你自己的编程语言处理的对象。
【tips】使用visual studio的开发者可以使用对象关系设计器the object relational designer,它为实现linq to sql的许多特性提供了一个用户界面。
二、使用linq to sql 进行简单操作.
通过使用 linq to sql,使得访问 sql 数据库,就像访问内存中的集合一样。
以下代码,创建一个northwnd对象,代表northwnd数据库,并从customers表中查询出城市为“london”的数据,返回一个集合,赋值给companynamequery,之后通过循环,输出集合内的元素。
// northwnd inherits from system.data.linq.datacontext. northwnd nw = new northwnd(@"northwnd.mdf"); // or, if you are not using sql server express // northwnd nw = new northwnd("database=northwind;server=server_name;integrated security=sspi"); var companynamequery = from cust in nw.customers where cust.city == "london" select cust.companyname; foreach (var customer in companynamequery) { console.writeline(customer); }
通过上述例子中,相必您已经体会到了linq to sql技术的强大之处了,接下来,我将带领你们逐步的吸收linq to sql技术。
三、如何动态创建数据库
在linq to sql技术中,对象模型和关系型数据库之间是映射关系。要想启用映射关系,一般可以通过使用基于特性的映射,或者是使用描述关系数据库结构的外部映射文件。在这两种情况下,如果你有足够的关系型数据库的信息,那么就可以通过使用datacontext.createdatabase()方法来创建数据库实例。
datacontext.createdatabase()方法,仅在对象模型中被编码信息的范围内创建数据库的副本。对象模型中的映射文件和特性,不会对现有数据库结构的所有内容进行编码。映射信息不表示用户自定义函数、存储过程、触发器或检查约束的内容。这种行为对于各种数据库来说已经足够了。
如果已知的数据提供者是可用的(如sql server 2008),那么你可以在任何情况下使用datacontext.createdatabase()方法。
- →构建一个自动安装在客户系统上的应用程序。
- →构建一个客户机应用程序,该应用程序需要一个本地数据库来保存其脱机状态。
您还可以使用datacontext.createdatabase()方法来使用sql server,通过创建.mdf文件或目录名,具体是哪种取决于您的连接字符串。linq to sql 使用连接字符串来定义将要创建的数据库,以及要创建数据连接的服务器。
【tips】尽可能的,请使用windows集成安全性连接到数据库,以便在连接字符串中不需要密码。
案例一:
该例展示了一个如何创建一个名为mydvds.mdf数据库的方式。
//在使用该例展示的方法之前,必须进行以下两个步骤: //1、添加引用system.data.linq; //2、使用using语句,添加命名空间,否则报错 // using tableattribute = system.data.linq.mapping.tableattribute; // using columnattribute = system.data.linq.mapping.columnattribute; //table特性,创建了数据库中的名为dvdtable的表与该类之间的映射关系。 [table(name = "myorders")] public class order { //column特性,创建了dvdtable表中同名列与该类成员属性之间的映射关系。 [column(isprimarykey = true)] public int id; [column] public string name; [column] public datetime date; public override string tostring() { return "order对象:{" + id + "," + name + "," + date + "}"; } } //自定义类 ,继承datacontext类。 public class myorders : datacontext { public myorders(string connection) : base(connection) { } public table<order> orders; } //创建一个myorders 类的对象db,该类继承自datacontext类。 myorders myorders = new myorders(@"d:\myfirstorder.mdf"); public void createdatabase() { if (myorders.databaseexists()) { //先判断该路径中,是否存在该数据库文件,如果存在,则删除。 messagebox.show("deleting old database..."); myorders.deletedatabase(); } //myorders对象创建数据库 myorders.createdatabase(); //释放datacontext实例,所使用的的所有资源 //myorders.dispose(); }
【注意】
myorders myorders = new myorders(@"d:\myfirstorder4.mdf");
语句中的myorders对象,最好设置成全局变量,如果设置成局部变量,后续在重复的调用方法时,可能会出现“该数据库已存在,请选择其他数据库名称”异常。
在构建自动安装在客户系统上的应用程序时,请先查看数据库是否已经存在,并在创建新数据库之前删除它。datacontext类提供databaseexists()和deletedatabase()方法来帮助您完成这个过程。
四、如何向数据库中insert数据
通过向关联的linq to sql里的table<tentity>集合添加对象,然后向数据库提交更改,您就可以将行插入到数据库中。link to sql将您提交的更改,翻译成适当的sql insert语句,然后提交到数据库执行的。
【tips】您也可以为linq to sql里默认的insert数据库、update数据库、delete数据库等操作进行重载。
以下步骤假设有一个连接到northwind数据库的datacontext连接。
- 1、创建一个新对象,包含要提交的列数据。
- 2、将新对象添加到与数据库中目标表相关联的linq to sql table集合中。
- 3、提交更改到数据库中。
下面代码展示了创建一个新的order对象(order是用户自定义类),然后为它填充适当的属性值。之后将新的order对象添加到order集合里。最后,将更改提交到数据库,作为orders表中一个新的行。
// create a new order object.order class is user defined class. order ord = new order { id = 12000, name = "harry potty", orderdate = datetime.now // … }; // add the new object to the orders collection. system.data.linq.table<order> table = myorders.gettable<order>(); table.insertonsubmit(ord); // submit the change to the database. try { myorders.submitchanges(); } catch (exception e) { messagebox.show(e.message); // make some adjustments. // ... // try again. myorders.submitchanges(); } //释放资源 //myorders.dispose();
【注意】在向数据库中的表里,insert数据或者后续的update、delete操作时,无论您对对象做了多少项更改,都只是在更改内存中的副本。 您并未对数据库中的实际数据做任何更改。 直到您对 显式调用datacontext里的submitchanges()方法 ,您所做的更改才会传输到服务器。
五、如何从数据库中query数据
linq to sql 中的查询使用与 linq 中的查询相同的语法。 唯一的差异是 linq to sql 查询中引用的对象映射到数据库中的元素。 有兴趣的朋友,可以看下 linq 查询知识。
下面的代码,展示了一个简单的查询请求,查询出id等于12000的订单,并将查询结果输出。
myorders myorders = new myorders(@"c:\northwnd.mdf"); system.data.linq.table<order> table = myorders.gettable<order>(); // query for customers in london. iqueryable<customer> custquery = from order in myorders.orders where order.id == 12000 select order; //将查询结果输出 foreach( var o in result) { console.writeline(o.tostring()); }
从数据库中查询数据,还有更多复杂的操作,后续我会继续整理更为详细的数据库查询操作,可以先关注下。
六、如何update表中的数据
通过修改与linq to sql 的table集合相关联的对象的成员值,然后将更改提交给数据库,那么就可以更新数据库中的某行数据。linq to sql 将你的改变转换为相对应的sql update语句。
将某行数据更新到数据库中的步骤如下:
1、在数据库中查询要更新的行。
2、对第1步的linq to sql 查询结果里的成员值进行所需的更改。
3、将更改提交到数据库里。
下面的示例在数据库中查询订单#11000,然后更改结果order对象中的name和date的值。最后,对这些成员值的更改作为name和date列中的更改提交给数据库。
// query the database for the row to be updated. var query = from ord in myorders.orders where ord.id== 11000 select ord; // execute the query, and change the column values // you want to change. foreach (order ord in query) { ord.name = "hong lou meng"; ord.date = datetime.now; // insert any additional changes to column values. } // submit the changes to the database. try { myorders.submitchanges(); } catch (exception e) { messagebox.show(console.writeline(e)); // provide for exceptions. } //释放datacontext对象占用的资源。 //myorders.dispose();
七、如何如何delete表中的数据
可以通过从与表相关联的集合中删除相应的linq to sql对象,来完成对数据库中某行的删除。linq to sql 会将删除操作转变为适当的sql delete语句。
linq to sql不支持或不识别级联删除操作。如果你想删除表中有约束的一行,你必须完成以下其中一项条件:
1、在数据库的外键约束中设置on delete cascade规则。
2、使用您自己的代码先删除阻止父对象被删除的子对象。
如果无法保证上述至少一个条件成立,则将抛出异常。请参阅本主题的第二个代码示例。
删除数据库中某一行的操作如下:
- 1、在数据库中查询需要删除的行。
- 2、调用deleteonsubmit方法。
- 3、将删除操作提交到数据库。
下面的第1个代码示例向数据库查询属于order# 11000的订单详细信息,将这些订单详细信息标记为删除,并将这些更改提交给数据库。
table<order> orders = myorders.gettable<order>(); // query the database for the rows to be deleted. var deleteresult = from ord in orders where ord.id == 11000 select ord; foreach (var ord in deleteresult ) { orders.deleteonsubmit(ord ); } try { myorders.submitchanges(); } catch (exception e) { messagbox.show(e.message); // provide for exceptions. }
在第二个代码示例中,目标是删除一个订单(#10250)。代码首先检查orderdetails表,以查看要删除的订单在那里是否有子订单。如果订单有子订单,则首先将子订单标记为要删除,然后将订单标记为要删除。datacontext将实际的删除按正确的顺序排列,以便发送到数据库的删除命令遵守数据库约束。
//northwnd myorders = new northwnd(@"c:\northwnd.mdf"); myorders myorders = new myorders(@"d:\myfirstorder.mdf"); myorders.log = console.out; // specify order to be removed from database int reqorder = 10250; // fetch orderdetails for requested order. var orddetailquery = from odq in myorders.orderdetails where odq.orderid == reqorder select odq; foreach (var selecteddetail in orddetailquery) { messagebox.show(selecteddetail.tostring()); myorders.orderdetails.deleteonsubmit(selecteddetail); } // display progress. messagebox.show("detail section finished."); // determine from detail collection whether parent exists. if (orddetailquery.any()) { messagebox.show("the parent is present in the orders collection."); // fetch order. try { var ordfetch = (from ofetch in myorders.orders where ofetch.orderid == reqorder select ofetch).first(); myorders.orders.deleteonsubmit(ordfetch); messagebox.show("{0} orderid is marked for deletion.", ordfetch.orderid); } catch (exception e) { messagebox.show(e.message); } } else { messagebox.show("there was no parent in the orders collection."); } // display progress. messagebox.show("order section finished."); try { myorders.submitchanges(); } catch (exception e) { messagebox.show(e.message); } // display progress. messagebox.show("submit finished.");
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论