您的位置:首页 > 其它

ADO.NET 概述

2006-05-06 16:39 435 查看
[align=left]ADO.NET是在用于直接满足用户开发可伸缩应用程序需求的ADO数据访问模型的基础上发展而来的。它是专门为Web设计的,并且考虑了伸缩性,无状态性和XML的问题。[/align]
[align=left]ADO.NET使用了某些ADO的对象,如ConnectionCommand对象,并且还引入了新的对象。主要的新ADO.NET对象包括DataSetDataReaderDataAdapter。[/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框架的一部分,它们提供四个基本对象:CommandConnectionDataReaderDataAdapter。在本文档的余下部分,我们将介绍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(以及与其关联的SqlCommandSqlConnection)能够提高整体性能。对于其他支持OLEDB的数据库,将使用OleDbDataAdapter对象及其关联OleDbCommandOleDbConnection对象。[/b]
在更改DataSet之后,DataAdapter对象使用命令来更新数据源。使用[b]DataAdapterFill方法调用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为突出重点来创建的。这些方案中提供了两个新对象:DataSetDataAdapter。[/align]
[align=left]3.ADO.NET可用来从流中获取数据,或将数据存储在缓存中以便更新。[/align]
[align=left]4.本文档中还有有关ADO.NET的更多信息。[/align]
[align=left]5.请记住,可以直接对数据库执行命令,以进行插入、更新和删除操作。无需先将数据放入DataSet中即可对其进行插入、更新或删除操作。[/align]
[align=left]6.此外,可以使用DataSet来绑定到数据、在数据间移动和定位数据关系。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: