ADO.NET 概述
2006-05-06 16:39
435 查看
[align=left]ADO.NET是在用于直接满足用户开发可伸缩应用程序需求的ADO数据访问模型的基础上发展而来的。它是专门为Web设计的,并且考虑了伸缩性,无状态性和XML的问题。[/align]
[align=left]ADO.NET使用了某些ADO的对象,如Connection和Command对象,并且还引入了新的对象。主要的新ADO.NET对象包括DataSet、DataReader和DataAdapter。[/align]
[align=left]ADO.NET这一发展版本与以前的数据结构之间的重要区别就是DataSet对象的存在,该对象独立于任何数据存储区并且与之不同。正因为如此,DataSet对象作为一个独立实体运行。可以将数据集(DataSet)设想为始终断开的记录集,它对其所包含的数据的源或目标一无所知。DataSet的里面很像数据库,有表、列、关系、约束、视图,等等。[/align]
[align=left]DataAdapter连接到数据库以填充DataSet的对象。然后,它又连接回数据库,根据DataSet保留数据时所执行的操作来更新数据库中的该数据。在过去,数据处理主要是基于连接的。现在,为了使多层应用程序更为高效,数据处理正转向基于消息的方式,围绕信息块进行处理。这种方式的中心是DataAdapter,它起着桥梁的作用,在DataSet和其源数据存储区之间进行数据检索和保存。这一操作是通过请求对数据存储区进行适当的SQL命令来完成的。[/align]
[align=left]基于XML的DataSet对象提供一致的编程模型,该模型可配合所有的数据存储模型使用,无论是单层的、关系型的、还是分层的。为做到这一点,DataSet对象对其数据源“一无所知”,并且将它拥有的数据表示为集合和数据类型。无论DataSet中数据的源是什么,它都是通过由DataSet与其从属对象所公开的同一套标准API来操纵的。[/align]
[align=left]虽然DataSet对其数据的源一无所知,但托管提供程序具有详细而具体的信息。托管提供程序的作用是在DataSet与数据存储区之间来回进行连接、填充和保持。OLEDB数据提供者与SQLServer.NET数据提供者(System.Data.OleDb和System.Data.SqlClient)是.Net框架的一部分,它们提供四个基本对象:Command、Connection、DataReader和DataAdapter。在本文档的余下部分,我们将介绍DataSet和OLEDB/SQLServer.NET数据提供程序的每一部分,解释它们是什么以及如何对它们进行编程。[/align]
[align=left]以下部分将向您介绍一些对象,其中有些是经过发展的,有些是全新的。这些对象如下:[/align]
[align=left]·Connection。用于连接到数据库和管理对数据库的事务。[/align]
[align=left]·Command。用于对数据库发出SQL命令。[/align]
[align=left]·DataReader。用于从SQLServer数据源读取只进数据记录流。[/align]
[align=left]·DataSet。用于对单层数据、XML数据和关系数据进行存储、远程处理和编程。[/align]
[align=left]·DataAdapter。用于将数据推入DataSet,并使数据与数据库保持一致。[/align]
[align=left]注意当处理到数据库的连接时,有两个不同的选项:SQLServer.NET数据提供程序(System.Data.SqlClient)和OLEDB.NET数据提供程序(System.Data.OleDb)。在这些示例中,我们将使用SQLServer.NET数据提供程序。这些示例的是为了直接与MicrosoftSQLServer交互。OLEDB.NET数据提供程序则用于与任何OLEDB提供程序交互(因为它在底层使用OLEDB)。[/align]
[align=left]Connection(连接)[/align]
[align=left]连接用于与数据库“对话”,并由SQLConnection等特定于提供程序的类来表示。命令(Command)将遍历连接并以流的形式返回结果集,该结果集可由DataReader对象读取,或是被推入DataSet对象。[/align]
[align=left]下面的示例说明如何创建连接对象。可通过调用连接上的Open方法来显式打开连接,也可在使用DataAdapter时隐式打开连接。[/align]
Command(命令)
命令包含向数据库提交的信息,并且由SQLCommand等特定于提供程序的类来表示。命令可以是存储过程调用、UPDATE语句或返回结果的语句。还可将输入和输出参数、以及返回值用作命令语法的一部分。下面的示例说明如何对Northwind数据库发出INSERT语句。
DataReader
DataReader对象对于数据有点像只读/只进游标。[b]DataReaderAPI既支持平面数据,也支持分层数据。在对数据库执行命令之后返回一个[b]DataReader对象。返回的DataReader对象的格式与记录集不同。例如,您可能会使用DataReader在Web页上显示搜索列表的结果。[/b][/b]
DataSet和DataAdapter
DataSet
[b]DataSet对象与ADORecordset对象相似,但功能更为强大,并具有另一重要区别:DataSet始终是断开的。[b]DataSet对象表示数据的缓存,具有类似数据库的结构,如表、列、关系和约束。但是,尽管[b]DataSet可以并且的确像数据库那样运行,但重要的是要记住:DataSet对象不直接与数据或其他源数据进行交互。这使得开发人员能够使用始终保持一致的编程模型,而不用理会源数据的驻留位置。所有来自于数据库、XML文件、代码或用户输入的数据都可添加到[b]DataSet对象中。这样,由于对DataSet进行了更改,所以在更新源数据之前可以对这些更改进行跟踪和验证。DataSet对象的[b]GetChanges方法实际上是创建了另一个DatSet,该DatSet只包含对数据做出的更改。然后,DataAdapter(或其他对象)使用此[b]DataSet来更新原始的数据源。[/b][/b][/b][/b][/b][/b]
DataSet具有许多XML特性,包括生成和使用XML数据和XML架构的能力。XML架构可以用来描述通过WebServices交换的架构。实际上,为了类型安全和语句结束,可以对带有架构的[b]DataSet进行编译。[/b]
DataAdapter(OLEDB/SQL)
[b]DataAdapter对象在DataSet与源数据之间起到桥梁的作用。在使用MicrosoftSQLServer数据库时,使用提供程序特定的SqlDataAdapter(以及与其关联的SqlCommand和SqlConnection)能够提高整体性能。对于其他支持OLEDB的数据库,将使用OleDbDataAdapter对象及其关联OleDbCommand和OleDbConnection对象。[/b]
在更改DataSet之后,DataAdapter对象使用命令来更新数据源。使用[b]DataAdapter的Fill方法调用SELECT命令;使用Update方法为每一发生更改的行调用INSERT、UPDATE或DELETE命令。可显式设置这些命令,以控制运行时用来解析更改的语句,包括对存储过程的使用。在特殊情况下,CommandBuilder对象可以根据Select语句在运行时生成这些命令。但是,在运行时生成需要一个额外的服务器往返以收集元数据,所以在设计时显式提供INSERT、UPDATE和DELETE命令将会获得更佳的运行时性能。[/b]
[align=left]SqlConnectionmyConnection=newSqlConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind");[/align]
[align=left]SqlDataAdaptermySqlDataAdapter=newSqlDataAdapter("select*fromcustomers",myConnection);[/align]
[align=left][/align]
[align=left]mySqlDataAdapter.InsertCommand.CommandText="sp_InsertCustomer";[/align]
[align=left]mySqlDataAdapter.InsertCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.DeleteCommand.CommandText="sp_DeleteCustomer";[/align]
[align=left]mySqlDataAdapter.DeleteCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.UpdateCommand.CommandText="sp_UpdateCustomers";[/align]
[align=left]mySqlDataAdapter.UpdateCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.Update(myDataSet);[/align]
记录将适当地映射到相应的给定命令。
图:DataAdapter和DataSet
以下示例阐释了通过SELECT语句加载一个DataAdapter。然后它在DataSet中更新、删除和添加一些记录。最后,通过DataAdapter将那些更新返回到源数据库。构造的DeleteCommand、InsertCommand和UpdateCommand将显示在页中。它还阐释了使用多个DataAdapter对象将多个表(Customers和Orders)加载到DataSet中。
[align=left]本节小结[/align]
[align=left]1.ADO.NET是用于.Net框架的ADO下一代版本。[/align]
[align=left]2.ADO.NET是以N层、无状态性和XML为突出重点来创建的。这些方案中提供了两个新对象:DataSet和DataAdapter。[/align]
[align=left]3.ADO.NET可用来从流中获取数据,或将数据存储在缓存中以便更新。[/align]
[align=left]4.本文档中还有有关ADO.NET的更多信息。[/align]
[align=left]5.请记住,可以直接对数据库执行命令,以进行插入、更新和删除操作。无需先将数据放入DataSet中即可对其进行插入、更新或删除操作。[/align]
[align=left]6.此外,可以使用DataSet来绑定到数据、在数据间移动和定位数据关系。[/align]
[align=left]ADO.NET使用了某些ADO的对象,如Connection和Command对象,并且还引入了新的对象。主要的新ADO.NET对象包括DataSet、DataReader和DataAdapter。[/align]
[align=left]ADO.NET这一发展版本与以前的数据结构之间的重要区别就是DataSet对象的存在,该对象独立于任何数据存储区并且与之不同。正因为如此,DataSet对象作为一个独立实体运行。可以将数据集(DataSet)设想为始终断开的记录集,它对其所包含的数据的源或目标一无所知。DataSet的里面很像数据库,有表、列、关系、约束、视图,等等。[/align]
[align=left]DataAdapter连接到数据库以填充DataSet的对象。然后,它又连接回数据库,根据DataSet保留数据时所执行的操作来更新数据库中的该数据。在过去,数据处理主要是基于连接的。现在,为了使多层应用程序更为高效,数据处理正转向基于消息的方式,围绕信息块进行处理。这种方式的中心是DataAdapter,它起着桥梁的作用,在DataSet和其源数据存储区之间进行数据检索和保存。这一操作是通过请求对数据存储区进行适当的SQL命令来完成的。[/align]
[align=left]基于XML的DataSet对象提供一致的编程模型,该模型可配合所有的数据存储模型使用,无论是单层的、关系型的、还是分层的。为做到这一点,DataSet对象对其数据源“一无所知”,并且将它拥有的数据表示为集合和数据类型。无论DataSet中数据的源是什么,它都是通过由DataSet与其从属对象所公开的同一套标准API来操纵的。[/align]
[align=left]虽然DataSet对其数据的源一无所知,但托管提供程序具有详细而具体的信息。托管提供程序的作用是在DataSet与数据存储区之间来回进行连接、填充和保持。OLEDB数据提供者与SQLServer.NET数据提供者(System.Data.OleDb和System.Data.SqlClient)是.Net框架的一部分,它们提供四个基本对象:Command、Connection、DataReader和DataAdapter。在本文档的余下部分,我们将介绍DataSet和OLEDB/SQLServer.NET数据提供程序的每一部分,解释它们是什么以及如何对它们进行编程。[/align]
[align=left]以下部分将向您介绍一些对象,其中有些是经过发展的,有些是全新的。这些对象如下:[/align]
[align=left]·Connection。用于连接到数据库和管理对数据库的事务。[/align]
[align=left]·Command。用于对数据库发出SQL命令。[/align]
[align=left]·DataReader。用于从SQLServer数据源读取只进数据记录流。[/align]
[align=left]·DataSet。用于对单层数据、XML数据和关系数据进行存储、远程处理和编程。[/align]
[align=left]·DataAdapter。用于将数据推入DataSet,并使数据与数据库保持一致。[/align]
[align=left]注意当处理到数据库的连接时,有两个不同的选项:SQLServer.NET数据提供程序(System.Data.SqlClient)和OLEDB.NET数据提供程序(System.Data.OleDb)。在这些示例中,我们将使用SQLServer.NET数据提供程序。这些示例的是为了直接与MicrosoftSQLServer交互。OLEDB.NET数据提供程序则用于与任何OLEDB提供程序交互(因为它在底层使用OLEDB)。[/align]
[align=left]Connection(连接)[/align]
[align=left]连接用于与数据库“对话”,并由SQLConnection等特定于提供程序的类来表示。命令(Command)将遍历连接并以流的形式返回结果集,该结果集可由DataReader对象读取,或是被推入DataSet对象。[/align]
[align=left]下面的示例说明如何创建连接对象。可通过调用连接上的Open方法来显式打开连接,也可在使用DataAdapter时隐式打开连接。[/align]
namespaceHowTo.Samples.ADONET
{
usingSystem;
usingSystem.Data.SqlClient;
publicclassadooverview1
{
publicstaticvoidMain()
{
adooverview1myadooverview1=newadooverview1();
myadooverview1.Run();
}
publicvoidRun()
{
SqlConnectionmySqlConnection=newSqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
try
{
mySqlConnection.Open();
Console.WriteLine("打开的连接{0}",mySqlConnection.ConnectionString);
//Closetheconnectionexplicitly
mySqlConnection.Close();
Console.WriteLine("已关闭。显式地关闭连接是很重要的。");
}
catch
{
Console.WriteLine("未能打开到{0}的连接",mySqlConnection.ConnectionString);
}
}
}
}
Command(命令)
命令包含向数据库提交的信息,并且由SQLCommand等特定于提供程序的类来表示。命令可以是存储过程调用、UPDATE语句或返回结果的语句。还可将输入和输出参数、以及返回值用作命令语法的一部分。下面的示例说明如何对Northwind数据库发出INSERT语句。
namespaceHowTo.Samples.ADONET
{
usingSystem;
usingSystem.Data.SqlClient;
publicclassadooverview2
{
publicstaticvoidMain()
{
adooverview2myadooverview2=newadooverview2();
myadooverview2.Run();
}
publicvoidRun()
{
stringMessage=null;
SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlCommandmySqlCommand=newSqlCommand("INSERTINTOCustomers(CustomerId,CompanyName,ContactName,ContactTitle,Address)Values('ABC','ABCCompany','JohnSmith','Owner','OneMyWay')",myConnection);
SqlCommandmySqlCleanup=newSqlCommand("DELETEFROMCustomersWHERECustomerId='ABC'",myConnection);
try
{
myConnection.Open();
mySqlCleanup.ExecuteNonQuery();//removerecordthatmayhavebeenenteredpreviously.
mySqlCommand.ExecuteNonQuery();
Message="新记录已插入northwind中的Customers表。";
}
catch(Exceptione)
{
Message="未能插入记录:"+e.ToString();
}
finally
{
myConnection.Close();
}
Console.Write(Message);
}
}
}
DataReader
DataReader对象对于数据有点像只读/只进游标。[b]DataReaderAPI既支持平面数据,也支持分层数据。在对数据库执行命令之后返回一个[b]DataReader对象。返回的DataReader对象的格式与记录集不同。例如,您可能会使用DataReader在Web页上显示搜索列表的结果。[/b][/b]
namespaceHowTo.Samples.ADONET
{
usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
publicclassadooverview3
{
publicstaticvoidMain()
{
adooverview3myadooverview3=newadooverview3();
myadooverview3.Run();
}
publicvoidRun()
{
SqlDataReadermyReader=null;
SqlConnectionmySqlConnection=newSqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlCommandmySqlCommand=newSqlCommand("select*fromcustomers",mySqlConnection);
try
{
mySqlConnection.Open();
myReader=mySqlCommand.ExecuteReader();
Console.Write("客户ID");
Console.WriteLine("公司名称");
while(myReader.Read())
{
Console.Write(myReader["CustomerId"].ToString()+"");
Console.WriteLine(myReader["CompanyName"].ToString());
}
}
catch(Exceptione)
{
Console.WriteLine(e.ToString());
}
finally
{
if(myReader!=null)
myReader.Close();
if(mySqlConnection.State==ConnectionState.Open)
mySqlConnection.Close();
}
}
}
}
DataSet和DataAdapter
DataSet
[b]DataSet对象与ADORecordset对象相似,但功能更为强大,并具有另一重要区别:DataSet始终是断开的。[b]DataSet对象表示数据的缓存,具有类似数据库的结构,如表、列、关系和约束。但是,尽管[b]DataSet可以并且的确像数据库那样运行,但重要的是要记住:DataSet对象不直接与数据或其他源数据进行交互。这使得开发人员能够使用始终保持一致的编程模型,而不用理会源数据的驻留位置。所有来自于数据库、XML文件、代码或用户输入的数据都可添加到[b]DataSet对象中。这样,由于对DataSet进行了更改,所以在更新源数据之前可以对这些更改进行跟踪和验证。DataSet对象的[b]GetChanges方法实际上是创建了另一个DatSet,该DatSet只包含对数据做出的更改。然后,DataAdapter(或其他对象)使用此[b]DataSet来更新原始的数据源。[/b][/b][/b][/b][/b][/b]
DataSet具有许多XML特性,包括生成和使用XML数据和XML架构的能力。XML架构可以用来描述通过WebServices交换的架构。实际上,为了类型安全和语句结束,可以对带有架构的[b]DataSet进行编译。[/b]
DataAdapter(OLEDB/SQL)
[b]DataAdapter对象在DataSet与源数据之间起到桥梁的作用。在使用MicrosoftSQLServer数据库时,使用提供程序特定的SqlDataAdapter(以及与其关联的SqlCommand和SqlConnection)能够提高整体性能。对于其他支持OLEDB的数据库,将使用OleDbDataAdapter对象及其关联OleDbCommand和OleDbConnection对象。[/b]
在更改DataSet之后,DataAdapter对象使用命令来更新数据源。使用[b]DataAdapter的Fill方法调用SELECT命令;使用Update方法为每一发生更改的行调用INSERT、UPDATE或DELETE命令。可显式设置这些命令,以控制运行时用来解析更改的语句,包括对存储过程的使用。在特殊情况下,CommandBuilder对象可以根据Select语句在运行时生成这些命令。但是,在运行时生成需要一个额外的服务器往返以收集元数据,所以在设计时显式提供INSERT、UPDATE和DELETE命令将会获得更佳的运行时性能。[/b]
[align=left]SqlConnectionmyConnection=newSqlConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind");[/align]
[align=left]SqlDataAdaptermySqlDataAdapter=newSqlDataAdapter("select*fromcustomers",myConnection);[/align]
[align=left][/align]
[align=left]mySqlDataAdapter.InsertCommand.CommandText="sp_InsertCustomer";[/align]
[align=left]mySqlDataAdapter.InsertCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.DeleteCommand.CommandText="sp_DeleteCustomer";[/align]
[align=left]mySqlDataAdapter.DeleteCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.UpdateCommand.CommandText="sp_UpdateCustomers";[/align]
[align=left]mySqlDataAdapter.UpdateCommand.CommandType=CommandType.StoredProcedure;[/align]
[align=left]mySqlDataAdapter.Update(myDataSet);[/align]
记录将适当地映射到相应的给定命令。
图:DataAdapter和DataSet
以下示例阐释了通过SELECT语句加载一个DataAdapter。然后它在DataSet中更新、删除和添加一些记录。最后,通过DataAdapter将那些更新返回到源数据库。构造的DeleteCommand、InsertCommand和UpdateCommand将显示在页中。它还阐释了使用多个DataAdapter对象将多个表(Customers和Orders)加载到DataSet中。
namespaceHowTo.Samples.ADONET
{
usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
publicclassadooverview4
{
publicstaticvoidMain()
{
adooverview4myadooverview4=newadooverview4();
myadooverview4.Run();
}
publicvoidRun()
{
//CreateanewConnectionandSqlDataAdapter
SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlDataAdaptermySqlDataAdapter=newSqlDataAdapter("Select*fromRegion",myConnection);
SqlParameterworkParam=null;
//Restoredatabasetoit'soriginalconditionsosamplewillworkcorrectly.
Cleanup();
//BuildtheinsertCommand
mySqlDataAdapter.InsertCommand=newSqlCommand("InsertintoRegion(RegionID,RegionDescription)VALUES(@RegionID,@RegionDescription)",myConnection);
workParam=mySqlDataAdapter.InsertCommand.Parameters.Add("@RegionID",SqlDbType.Int);
workParam.SourceColumn="RegionID";
workParam.SourceVersion=DataRowVersion.Current;
workParam=mySqlDataAdapter.InsertCommand.Parameters.Add("@RegionDescription",SqlDbType.NChar,50);
workParam.SourceVersion=DataRowVersion.Current;
workParam.SourceColumn="RegionDescription";
//Buildtheupdatecommand
mySqlDataAdapter.UpdateCommand=newSqlCommand("UpdateRegionSetRegionDescription=@RegionDescriptionWHERERegionID=@RegionID",myConnection);
workParam=mySqlDataAdapter.UpdateCommand.Parameters.Add("@RegionID",SqlDbType.Int);
workParam.SourceColumn="RegionID";
workParam.SourceVersion=DataRowVersion.Original;
workParam=mySqlDataAdapter.UpdateCommand.Parameters.Add("@RegionDescription",SqlDbType.NChar,50);
workParam.SourceVersion=DataRowVersion.Current;
workParam.SourceColumn="RegionDescription";
DataSetmyDataSet=newDataSet();
//SettheMissingSchemaActionpropertytoAddWithKeybecauseFillwillnotcauseprimarykey&uniquekeyinformationtoberetrievedunlessAddWithKeyisspecified.
mySqlDataAdapter.MissingSchemaAction=MissingSchemaAction.AddWithKey;
mySqlDataAdapter.Fill(myDataSet,"Region");
DataRowmyDataRow1=myDataSet.Tables["Region"].Rows.Find(2);
myDataRow1[1]="已更改此地区说明";
DataRowmyDataRow2=myDataSet.Tables["Region"].NewRow();
myDataRow2[0]=901;
myDataRow2[1]="新地区";
myDataSet.Tables["Region"].Rows.Add(myDataRow2);
try
{
mySqlDataAdapter.Update(myDataSet,"Region");
Console.Write("已成功更新数据集!");
}
catch(Exceptione)
{
Console.Write(e.ToString());
}
}
publicvoidCleanup()
{
SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
try
{
//Restoredatabasetoit'soriginalconditionsosamplewillworkcorrectly.
myConnection.Open();
SqlCommandCleanupCommand=newSqlCommand("DELETEFROMRegionWHERERegionID='901'",myConnection);
CleanupCommand.ExecuteNonQuery();
}
catch(Exceptione)
{
Console.Write(e.ToString());
}
finally
{
myConnection.Close();
}
}
}
}
[align=left]本节小结[/align]
[align=left]1.ADO.NET是用于.Net框架的ADO下一代版本。[/align]
[align=left]2.ADO.NET是以N层、无状态性和XML为突出重点来创建的。这些方案中提供了两个新对象:DataSet和DataAdapter。[/align]
[align=left]3.ADO.NET可用来从流中获取数据,或将数据存储在缓存中以便更新。[/align]
[align=left]4.本文档中还有有关ADO.NET的更多信息。[/align]
[align=left]5.请记住,可以直接对数据库执行命令,以进行插入、更新和删除操作。无需先将数据放入DataSet中即可对其进行插入、更新或删除操作。[/align]
[align=left]6.此外,可以使用DataSet来绑定到数据、在数据间移动和定位数据关系。[/align]
相关文章推荐
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- ado.net视频教程 之 ado.net概述 [视频]
- ADO.NET_01_概述
- ADO.NET概述(第十六课)
- ADO.NET 实体框架概述
- 翻译:改进.NET应用程序的性能和可伸缩性(一)-概述及ADO.NET 性能
- ADO.NET 快速入门(一):ADO.NET 概述
- ADO.net框架 概述
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- ADO.NET Entity Framework 概述
- ADO.net框架 概述
- ado.net事务点滴之一 概述
- ADO.NET 实体框架概述
- ADO.NET读书笔记系列 ADO.NET概述
- ADO.NET Entity Framework 概述
- ADO.NET 4 快速上手(1)——概述
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- 用ADO.NET访问数据库过程概述
- ADO.NET 概述
- 好文转载:ADO.NET 实体框架概述