码迷,mamicode.com
首页 > Web开发 > 详细

ADO.NET 技术

时间:2015-07-01 10:17:28      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:数据   c#   数据库   面向对象   vs   

 
                          ADO.NET 技术

前言
   作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角

色。本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET

的主要组成部分。


一、ADO.NET是什么?

  简单的说,ADO.NET是一组允许.NET开发人员使用标准的,结构化的,甚至无连接的

方式与数据交互的技术。对于ADO.NET来说,可以处理数据源是多样的。可以是应用程序

唯一使用的创建在内存中数据,也可以是与应用程序分离,存储在存储区域的数据(如

文本文件、XML、关系数据库等)。

       

                    技术分享

  

  ADO.NET是ADO(ActiveX Data Objects)的升级版本,是一个类库,主要用于.NET 

Framework平台对数据的操作。提供一致的对象模型,可以存取和编辑各种数据源的数

据,即对这些数据源,提供了一致的数据处理方式。

   

  具体来说,ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 

和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来

连接到这些数据源,并检索、处理和更新所包含的数据。

      

  作为.NET框架的重要组成部分,ADO.NET 类封装在 System.Data.dll 中,并且与 

System.Xml.dll 中的 XML 类集成。当编译使用 System.Data 命名空间的代码时,需要

引用System.Data.dll 和 System.Xml.dll。




二、对比

 

1、ADO.NET 和asp.net

    
  ado.net是数据库的一种访问方式,不能与asp.net相提并论,asp.net是基
于.NetFramdwork 的网站开发技术。

 在数据库访问主要使用ADO.NET方式,主要表现对象为:DataSet 内存加载数据方式!

 ADO.NET方式与以前的ADO方式或者Oledb性能要强很多


2.ADO.NET和ADO关系

  作为一个普通的缩略词,"ADO.NET”并只不是"ADO”的简单升级版本。严格的讲,


ADO.NET和ADO是两种截然不同的数据访问方式

    

  ADO的全称是Activex Data Objects,它是早期(.NET还未实施)开发人员用来访问数

据的组件。随着.NET的发展,ADO.NET顺其自然地以其显著的优越性逐步取代ADO。从技

术层面讲,ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接

口并且基于微软的.NET体系架构。

   

  虽然大多数基于 .NET 的新应用程序将使用 ADO.NET 来编写,但 .NET 程序员仍然可

以通过 .NET COM 互操作性服务来使用 ADO。

 


三、具体流程:

1 我要把河那边的物品运过来,我先修桥(DataConnection),

2 然后就要制作命令计划,是运过去(insert)物品还是运过来(Select)物品或者是销毁物

品(delete)等等.(这个命令计划就是Command).

3 然后用车子去运(DataAdapter就是车子),

4 接着要将物品放入一个池子中(DataSet就是池子),

5 而DataReader就是桥那头的一个照相机,可以把物品的数据进行拍照,传过来.

6 至于DataGrid DataView DataList等等都是数据视图(控件),就是展现数据的,比如我

最后要看的是物品里的糖果,那么这就是一个DataGrid或者DataView .


            技术分享



  Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,

将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或

Adapter 对象操作数据结果 

Connection 对象 

建立Connection 对象的代码: 

OLEDB: OleDbConnection MyConnection=new OleDbConnection(); 

SQL: SqlConnection MyConnection=new SqlConnection(); 

◆他们的ConnectionString属性:获取或设置连接语句。 

MyConnection.ConnectionString="server=(local);database=pubs;uid=sa;pwd=‘‘"; 

◆DataBase 属性:获取当前打开数据库 

◆DataSource属性:获取打开数据库的连接实例 

◆Open 方法:打开连接 

◆Close 方法:关闭连接 



                      Command与DataReader 对象 

 Command 对象中包含了提交数据库系统的访问信息。OleDbCommand 与SqlCommand 对

象,它们的基本对象和操作方法是相同的,在此介绍OleDbCommand的用法,SqlCommand的

用法类推即可. 

如: OleDbCommand myComm = new OleDbCommand(strQuery,myConnection); 

第一个参数是sql语句或存储过程名,第二个参数是前面的Connection 对象的实例 

Command 对象的只要的属性和方法有: 

◆Connection 属性:设置或获取 Command对象使用的Connection 对象实例 

◆CommandText 属性:设置或获取需要执行的sql语句或存储过程名 

◆CommandType 属性:设置或获取执行语句的类型。它有3个属性

值:StoredProceduce(存储过程) TableDirect Text(标准的SQL语句) 默认是Text 

◆Parameters 属性:取得参数值集合 

◆ExecuteReader 方法:执行CommandText指定的SQL语句或存储过程名,返回值类型为

                           
              
                                  DataReader 

◆ExecuteNonQuery 方法:与ExecuteReader 功能相同,只是返回值为执行sql语句或存

储过程受影响的记录行数 

DataReader 的主要属性和方法有: 

◆FieldCount 属性:显示当前数据记录的字段总和 

◆IsClosed 属性: 判断DataReader 对象是否已经关闭 

◆Close 方法:关闭DataReader 对象 

◆GetString方法:以String类型返回指定列中的值 

◆Getvalue 方法:以自身的类型返回指定列中的值 

◆Getvalues 方法:返回当前记录所有字段的集合 

◆Read 方法:将“光标”指向DataReader对象的下一记录 


Sql连接实例: 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<script language="C#" runat="server"> 
void Page_Load(Object sender, EventArgs e) { 
SqlConnection Conn=new SqlConnection(); 
Conn.ConnectionString="server=(local);database=pubs;uid=sa;pwd=''"; 
Conn.Open(); 
SqlCommand Comm=new SqlCommand("select * from Authors ",Conn); 
SqlDataReader dr=Comm.ExecuteReader(); 
dg.DataSource=dr; 
dg.DataBind(); 
Conn.Close(); 
} 
</script> 
<asp:DataGrid id="dg" runat="server" /> 
Aeccess 数据库连接实例 (OleDbCommand 和 OleDbDataReader 使用实例) 
<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Data"%> 
<%@ Import Namespace="System.Data.OleDb"%> 
<script Language="C#" Runat="Server"> 
OleDbDataReader dr; 
public void Page_Load(Object src,EventArgs e) 
{ 
string 

myConnstring="provider=Microsoft.Jet.OLEDB.4.0; Data 

Source="+Server.MapPath(".")+"..\\DataBase\\db2.mdb;"; 
string strSel="Select * from BookMark"; 
OleDbConnection myConn= new OleDbConnection 

(myConnstring); 
OleDbCommand myComm=new OleDbCommand(strSel,myConn); 
myComm.Connection.Open(); 
dr=myComm.ExecuteReader(); 
dg.DataSource=dr; 
dg.DataBind(); 
myConn.Close(); 
} 
</script> 
<html> 
<body> 
<form Runat="Server"> 
<asp:DataGrid id="dg" runat="server" /> 
</form> 
</body> 
</html> 



                   DataSet 与DataAdapter 

 DataReader 对象只能实现对数据的读取,不能完成其他的操作。ADO.NET提供一款更强

大的数据操作对象――DataSet 可以将DataSet看成一个非连接的数据库,因为DataSet

的内部存储结构与数据库很类似,拥有数据表(DataTable)数据表关联

(DataRelation)。DataSet中可以存储多张表等。DataSet拥有类似于数据库的结构,

但它并不等同于数据库。首先他可以存储来自数据库的数据,而且还可以存储其他格式

的数据,比如 XML格式文档; 

1.查询数据 

讲到DataSet的数据库应用,先要了解ADO.NET中的另一个对象DataAdapter . 

它也分为SqlDataAdapter 和OleDbDataAdapter 

建DataAdapte: 

OleDbDataAdapter MyAdapter=new OleDbDataAdapter(); 

SqlDataAdapter MyAdapter=new SqlDataAdapter(); 

取得的DataAdapter 对象时必须赋予一个连接对象: 

MyAdapter.SelectCommand.Connection = MyConn; 或 

MyAdapter.UpdateCommand.Connection =Myconn; 或 

MyAdapter.DeleteCommand.Connection = MyConn; 或 

MyAdapter.InsertCommand.Connection =Myconn; 

如果需要执行SQL语句,那么还必须给相应的CommandText 属性赋值。代码为: 

MyAdapter.*Command.CommandText = SQL语句; 

写这么多行代码似乎有些麻烦,如果你只是查询数据库,则可以在建立 DataAdapter实

例时就完成上述工作。 
OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSelect,objConnection); 
<%@ Page Language="C#" Runat="Server"%> 
<%@ Import Namespace="System.Data"%> 
<%@ Import Namespace="System.Data.OleDb"%> 
<script Language="C#" Runat="Server"> 
public void Page_Load(Object src,EventArgs e) 
{ 
string 

MyConnString="Provider=Microsoft.Jet.OLEDB.4.0;Data 

Source="+Server.MapPath(".")+"\\DataBase\\db3.mdb;"; 
string strSel="select * from Score"; 
//建立一个DataSet 实例 
DataSet ds=new DataSet(); 
OleDbConnection MyConn= new OleDbConnection(MyConnString); 
OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn); 
MyAdapter.Fill(ds,"Score"); 
dg1.DataSource=ds.Tables["Score"].DefaultView; 
dg1.DataBind(); 
} 
</script> 
<asp:DataGrid id="dg1" runat="Server" 
Headerstyle-BackColor="#aaaadd" 
AlternatingItemstyle-BackColor="#eeeeee" 
/> 


  将DataAdapter 于 DataSet 相联系的是 DataAdapter 对象的 Fill 方法。他有很多

中用法: MyDataAdapter.Fill(DataSet) MyDataAdapter.Fill(DataSet,TableName) 

MyDataAdapter.Fill(DataSet, StartRow , RowsCount, TableName) 

DataSet 绑定至 DataGrid 控件显示: 

 1.dg1.DataSource= ds.Tables[“Score”].DefaultView; dg1.DataBind(); 

 2.dg1.DataSource=ds; dg1.DataMember=”Score”; dg1.DataBind(); 

  提示: DataSet中的各种集合,访问子项有两种方法,一种是用子项的名,一种是用数字

索引.比如要访问表”Score”,可以用: DataSet.Tables[0] 访问 (多张表依次类推) 

2. 插入数据: DataSet 的结构和数据库相似,所有插入数据实质上就是在DataSet 的数

据表里插入一行(DataRow) 
<pre name="code" class="csharp">//新建一行 
DataRow dr= ds.Tables[“Score”].NewRow(); 
dr. [“Name”] = “addme”; 
dr. [“class”] =”201”; 
ds.Tables[“Score”].Rows.Add(dr); //将新建的行加到DataTable 的DataRow集合中 
这样对DataSet的操作仅仅是在DataSet中执行,并不影响数据库中的数据,要使用DataAdapter 的 Update 方法(有多种方法). 
1. DataAdapter.Update(DataSet) ; 2. DataAdapter.Update(DataSet, TableName); 
3.更新数据: 实际就是在DataSet 数据行上面直接修改数据 
DataRow dr = ds .Tables[“Score”].Rows[0]; //取出第一行 
dr. [“Name”] = “比尔”; //修改 
dr. [“class”] =”201”; 




如果要更新数据库,则再调用 Update 方法 

 4.删除数据: 找到相应的数据行,然后删除 

DataRow dr =ds.Tables[“Score”].Row[0]; dr.Delete(); 

注意: DataAdapter 对象在数据发生改变时,并不能自动产生数据库系统所需的交易sql

语句,所有要建立一个CommandBuilder 对象 它能自动产生交易的sql语句. 

OleDbCommandBuilder custcb = new OleDbCommandBuilder(MyAdapter); 


5.DataSet 的其他特征 

DataSet 、DataTable 和DataRow 都有一个十分有用的方法----RejectChanges, 

它时操作对象拒绝已经发生的改变,将数据复原.该方法于AcceptChanges HasErrors等属

性连用非常有用. 
If (DataSet.HasErrors) 
{ 
DataSet.RejectChanges(); 
} 
else 
{ 
DataSet.AcceptChanges(); 
}


小结:
 ADO.NET为.NET构架提供了优化的数据访问模型,和基于COM的ADO是完全两样的数据访
问方式。也正因为ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致
的数据类型转换,从而提高了整体性能。

  


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

ADO.NET 技术

标签:数据   c#   数据库   面向对象   vs   

原文地址:http://blog.csdn.net/u013067756/article/details/46701085

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!