.net 3.5 数据库开发 之 ADO.net
进行数据库方面的开发有一段时间了,之前一直使用ADO.net 2.0 进行数据库开发,现在学习了一下LINQ to SQL和ADO.net Entity Framework,现在对之前所使用的ADO.net 2.0和现在学习的ADO.net 实体框架作一个小结。
在ADO.net 2.0中,比较常用的操作数据库的方式有两种,对应着两种重要的模式:1.通过SqlCommand执行SQL语句,并用DataReader读取,这种方式为连线模式,因为在使用DataReader进行读取时,DataReader采用逐行读取的方式,要一直保持连接状态,直到读取完成,才可以关闭连接;2.通过DataSet操作数据库,这种方式对应的为离线模式,DataSet对应于数据库,其中包含DataTable、DataView和Relation等,对应于数据表,视图和各表之间的关系,DataSet保存在内存中,由于主要操作都是在和数据库断开连接的情况下进行的,所以效率很高。
ADO.net 的推出,是数据库编程的一大进步,但是它仍然存在很多问题。比如多表操作时,不论使用SQL语句还是DataSet,都会带来很多的问题,也许存储过程会更好一些,但从编程语言的角度来讲,这种问题仍是需要解决的。在某种意义上,我们可以认为ADO.net 比较底层,我们可以通过自己设计上层架构,实现简单的ORM映射或者使用现存的ORM框架,如NHibernate,这样也许会解决一部分问题。
微软在ADO.net 之后推出了自己的ORM框架,LINQ to SQL和ADO.net Entity Framework,这两种框架分别用来解决不同的问题,但现在社区对这两种ORM框架褒贬不一,很多人认为这两种框架的设计存在较多的缺陷,希望微软加以改进。所以在学习中我也比较忐忑,不知道,这两种框架未来的方向会怎样?
从LINQ to SQL的框架来看,底层采用的是ADO.net Provider,所以LINQ to SQL是以ADO.net 为基础的,对ADO.net 的理解可以帮助我们更好的学习LINQ to SQL,虽然之前也研究过ADO.net,并进行过相关的开发,但有些细节问题,我在使用中却没有注意到:
1、MARS(Multiple Active Result Sets)
在ADO.net 1.1 搭配 SQL Server2000时,一个Connection对象只能同时拥有一个DataReader对象开启,当DataReader对象为调用Close函数关闭前,无法再开启一个DataReader对象,这主要是SQL Server2000的限制。
在SQL Server2005中已经没有了这个限制,所以开发人员可以在同一个Connection中开启多个DataReader对象,这个技术成为MARS,我们可以在连接字符串中设置MultipleActiveResultSets=True启用MARS功能。
在ADO.net Entity Framework中,当由系统自动生成连接字符串时,默认MARS是开启的。
2、异步模式
设置连接字符串Asynchronous Processing=true,
在执行Reader时调用IAsyncResult r = cmd.BeginExecuteReader();
然后通过r.IsCompleted判断是否执行完成,
当返回TRUE时,执行XXXDataReader reader = cmd.EndExecuteReader();进行读取操作。
示例:
using ( SqlConnection conn = new SqlConnection(
"Data Source=local;Initial Catalog = Northwind;User ID=sa;Asynchronous Processing=true"))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * From Customers";
IAsyncResult r = cmd.BeginExecuteReader();
while ( !r.IsCompleted)
{
Thread::Sleep(1000);
}
using (SqlDataReader reader = cmd.EndExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
}