首页 > 代码库 > ADO.NET对象模型

ADO.NET对象模型

 

ADO.NET建立在NetFramwork一些核心类的基础之上,可以将这些类分为两组:用于包含于管理数据的容器类与用于连接特定数据源的控制类。

容器类是通用的,无论使用什么样的数据源,都可以使用相同的数据容器实现数据存储。

用于连接特定数据源的类成为ADO.NET的数据提供程序。此处仅研究AQL Server数据库提供程序。

几个重要的命名空间:

System.Data:包含了DataSet与DataRelation类,支持结构化关系数据的操纵。独立于特定的数据库类型与连接方式。

System.Data.Common:提供特定的数据源自定义版本

System.Data.SqlClient:用于连接SqlServer数据库与执行命令的类。

System.Data.SqlTypes:包括了SqlServer数据类型的结构。可以运用这些类型对SqlServer数据库类型直接操作。

System.Data.OracleClient:

System.Data.Odbc

 

ADO.NET的链接对象:ADO.NET类包含了直接连接数据源的类与脱机情况下操纵数据的类。

1.      Connection对象用来和数据库建立连接。在ADO.NET以单个Connection类的形式建模。Connection类表示一个数据源的单个连接,但不代表单个调用。

常用属性:

ConnectionString属性:获取用来连接到数据库的链接字符串

DataBase属性:在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符串中指定的数据库名。

DataSource属性:获取或设置对象,数据绑定控件从该对象中检索其数据项列表

IsLocalConnection:是否是本地连接

State属性:是一个枚举类型的值,用来表示同当前数据库的连接状态。

属  性  值     对 应 含 义

Broken     该连接对象与数据源的连接处于中断状态。只有当连接打开后再与数据库失去连接才会导致这种情况。可以关闭处于这种状态的连接,然后重新打开

Closed      该连接对象正在与数据源连接

Connecting       该连接对象正在与数据源连接

Executing          该连接对象正在执行数据库操作的命令

Fetching   该连接对象正在检索数据

Open         该连接处于打开状态

常用方法:

Close():

Open():

BeginTransaction():用于创建Transaction语句

1.      Command对象:在连接好数据源之后,命令操作包括从数据存储区检索或对数据存储

区进行插入、更新、删除等操作。在ADO.NET没有Command对象,不能对数据库进行任何实际的操作。操作实现的方法可采用SQL语句,也可以采用存储过程。

常用属性:

CommandType:获取或设置Command对象要执行的类型

CommandText:获取或设置数据源执行的SQL语句或存储过程名或表名

CommandTimeOut:获取或设置在种植对执行命令的尝试并生成错误报告的等待时间

Connection:获取或设置Command对象使用的Connection对象的名称

常用方法:

ExecuteNonQuery():执行SQL语句并返回受影响的函数

ExecuteScalar():执行查询,并返回产寻所返回的结果集中的第一行的第一列,忽略其他行与列。

ExecuteReader():执行并返回数据集的SELECT语句

1.      DataReader对象:提供了顺序的只读的方式读取Command对象获得的数据结果集。由于DataReader只执行数据操作,并且每一次只在内存缓冲区里存储结果集中的一条数据,所以效率比较高。

常用属性:

FieldCount属性:获取由DataReader得到的一行数据中的字段数。

HasRows属性:表示DataReader是都包含数据

IsClosed属性:表示DataReader对象是否关闭

注:在SQLServer中提供程序里的DataReader对象成为SqlDataReader

常用方法:

Close():不带参数,无返回值,用来关闭DataReader对象。

Bool Read():让记录指针指向本结果集中的下一条巨鹿,返回值是true或false

Bool NextResult():记录指针指向下一个结果集。当调用该方法获得下一个结果集的时候,需要调用Read()来访问该结果集。

Object GetValue(int i):该方法根据传入的列的索引值,返回当前记录行里指定列的值

Int GetValues(Object[] Values):将当前记录的所有数据保存到一个数组里,并返回。可以使用FieldCount属性来得到记录行里的总数,据此定义接受返回值的数组长度。

Bool IsDBNull(int i):该方法的额参数用来指定索引号。该方法用来判定指定索引号的列植是否为空。

获得指定字段的方法GetString、GetChar、GetInt32等,这些方法都带有一个表示列索引的参数,返回均是Object类型。用户可以根据字段的类型,通过输入列索引,分别调用上述方法,获得指定列的值。例如,在数据库里,id的列索引是0,通过string id = GetString (0);代码可以获得id的值。

返回列的数据类型和列名的方法:可以调用GetDataTypeName()方法,通过输入列索引,获得该列的类型。这个方法的定义是:string GetDataTypeName (int i)。可以调用GetName()方法,通过输入列索引,获得该列的名称。这个方法的定义是:string GetName (int i)综合使用上述两方法,可以获得数据表里列名和列的字段。

1.      Transaction对象:有时需要对数据库的操作组织起来,作为一个独立的工作单元进行处理。在数据库编程中,这样的额工作单元被成为事务。Connection对象有一个方法BeginTransaction()用来创建Transaction对象。该对象可用来在Transaction的生命周期结束时提交或放弃对数据库所作的操作。

常用属性:

IsolationLevel:获取事务的隔离级别。

TransactionInformation:检索有关某个事务的附加信息。    

Current:获取或设置环境事务。

常用方法:

Clone():创建事务的克隆。

Dispose():释放由该对象占用的资源。

Equals():确定此事务和指定的对象是否相等。

op_Equality():测试两个指定的 Transaction 实例是否等效。静态

op_Inequality():返回一个值,该值指示 Transaction 的两个实例是否相等。静态

ReferenceEquals() :确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)静态

Rollback():已重载。 回滚(中止)事务。

ToString() :返回表示当前 Object 的 String。 (从 Object 继承。)

Commit():提交

2.      Parameter对象:

常用属性

ConvertEmptyStringToNull:获取或设置一个值,该值指示在 Parameter 对象绑定到的值为 String.Empty 时是否应将其转换为 空引用(在 Visual Basic 中为 Nothing)。

DefaultValue:指定参数的默认值(如果调用 Evaluate 方法时参数绑定到的值未被初始化)。

Direction:指示 Parameter 对象是否用于将值绑定到控件,或者是否可以使用控件更改值。

Name:获取或设置参数的名称。

Size:获取或设置参数的大小。

Type:获取或设置参数类型。

常用方法:

Clone:返回当前 Parameter 实例的副本。

Evaluate:更新并返回 Parameter 对象的值。

ToString :将此实例的值转换为其等效的字符串表示。

3.     

DataAdapter对象:可以隐藏和Connection、Command镀锡ianggoutong的一些细节。通过DataAdapter对象建立初始化DataTable,与DataSet对象一起,在内存存放数据表的副本,是ixantuoji模式下的数据库操作。DataAdapter对象允许将DataSet对象中的数据保存到数据源中,也可以从数据源中读取数据,并且也可以以底层数据存储进行数据的添加删除更新等操作。

常用命令:

SelectCommand:用来提取数据源中的记录

InsertCommand:用来想数据源中插入一条记录

UpdateCommand:用来更新数据源中的数据

DeleteCommand:用来删除数据源中的记录

Fill():参数为DataSet对象。DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。 但是,对于大量的查询结果,它可能并不是首选的分页方法,因为 DataAdapter 虽然仅使用所请求的记录来填充目标 DataTable 或 DataSet,但仍会使用返回整个查询的资源。 若要在从数据源中返回一页数据时不使用返回整个查询的资源,请为查询指定附加条件,使返回的行数减少到只返回所需的行。例:adapter.Fill(dataSet, currentIndex, pageSize, "Orders");

ADO.NET脱机对象:

1.     

DataTable:支持任意通过行和列的集合查看数据。通过DataAdapter对象的Fill()方法可以将查询的而结果保存到DataTable对象中。

用法:

创建一个内存表:auto.Columns.Add("ID");auto.Columns.Add("Name");

for(int i=1;i<=10;i++) auto.Rows.Add(new object[]{i,"baibaoqing"});

DataTable 的复制和克隆:

1.     

创建DataTable的完全副本(full copu 复制表的结构和数据)。

DataTable copy_Table=auto.Copy()

2.     

复制DataTable 的表模式(表结果)而不复制数据:

DataTable clone_Table=auto.Clone();

3.     

在Clone的副本中添加源对象中的而某些数据:

clone_Table.ImportRow(auto.Rows[0]);

4.     

枚举DataTable:通过Foreach循环遍历DataTable的行和列

foreach(DataRow dr in auto.Rows)

foreach(DataColumn dc in auto.Colmns){OPERATE_CODES}

5、访问其中的数值:DataTable.Rows[index] ["columnName"]。

1.     

DataColumn对象:每个DataTable对象都有一个Columns集合,这个集合就是DataColmn对象对应表中的每一列。但是DataColmn没有保存DataTable中的数据,二十维护有关列结构的信息。这种信息被成为元数据。利用这些数据可以得到列的全称与类型等信息。

2.     

Constraint对象:在DataTable对象的额数据中igong了一种定义约束的机制。例如:我们可以创建一个    Constraint对象,确保某一列或多个列的值在DataTable中是唯一的。Constraints对象存储在DataTable对象的Constraints集合中。

3.     

DataRow对象:要访问的DataTable对象中的数据,可以使用对象的Rows集合。该集合包含了一组DataRow对象。用DataRow对象的Item属性来读取某行中任一列的值。

常用方法:

Delete():实际上并不从DataRow表的Row集合中删除该DataRow.当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。(逻辑删除)

4.     

DataSet对象:包含一组数据。可以看做是DataTable对象的容器。通过将DataSet对象作为多个DataTable对象的额容器,减少应用程序同数据库的连接次数,获得更好的性能。

常用属性:

CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。

DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet".如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。

DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False.

NameSpace和Prefix:指定XML命名空间和前缀    

Relations:返回一个DataRelationCollection对象。

Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。

常用方法:

AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。

调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。

Clear:清除DataSet中所有DataRow对象。

Clone和Copy:与前面的类似,完全拷贝还是模式拷贝

HasChange:表示DataSet中是否包含挂起更改的DataRow对象。

GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。

Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。

Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好

事件:

MergeFailed:在DataSet的Merge方法发生一个异常时触发。

5.     

DataRelation对象:数据库中的标通常具有一定的关联。应用程序可能需要从多个不同的DataTable中提取或者操作数据。DataSet对象通过DataRelation对象这个要求。DataSet定义了一个Relation属性,该属性石DataRelation对象的一个集合。可以使用DataRelation对象表名DataSet中不同的DataTable对象之间的关系。一旦创建了DataRelation对象,就可以使用一些代码来获取DataRow对象的数组,以获取具有一定关系的来自多个表的数据。

6.     

DataView对象:DataView能够为DataTable对象中的额数据提供查看数据的多种试图。

常用方法:

1、Sort排序:DataView view=new DataView(auto); view.Sort="Make ASC,Year DESC";

不过,可以通过在SELE语句中增加order by 实现排序,从而省去此处的排序需求

2、使用RowFilter 精确查找:view.RowFilter="Make like ‘AA%‘ and Year>2001";

3、将DataView 导出到一个新表:

DataTable new_Table=view.ToTable("MyTable",true,"id","name");

MyTable 新表的名称,true 表示显示不同的值,将相同的行删除

1.     

枚举DataView:和枚举DataTabe大同小异

foreach(DataRowView dv in view)

foreach(DataColumn dc in auto.Colmns){OPERATE_CODES}

DataSet的使用详解:

1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");

2、查看调用SqlDataAdapter.Fill创建的结构

da.Fill(ds,"Orders");DataTable tbl = ds.Table[0];

foreach(DataColumn col in tbl.Columns) Console.WriteLine(col.ColumnName);

3、查看SqlDataAdapter返回的数据

1、DataRow对象:DataTable tbl = ds.Table[0]; DataRow row = tbl.Row[0];

2、检查存储在DataRow中的数据:DataTable tbl = row.Table;foreach(DataColumn col in tbl.Columns)

3、检查DatTable中的DataRow对象:foreach(DataRow row in tbl.Rows)

4、校验DataSet中的数据

1、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique

2、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints

通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。

3、用SqlDataAdapter.Fill模式来检索模式信息

5、遍历DataSet

foreach(DataTable dt in dataSet.Tables)

foreach(DataRow dr in dt.Rows)

foreach(DataColumn dc in dr.Table.Columns)

Console.WriteLine(dr[dc]);

 

 

 

 

访问数据库(查询):联机

建立连接:

1、连接字符串的定义:

string connstring="DataSource=IP;UserId=sa;Password=123;Initial Catalog=DB_Name";

2、建立连接:

SqlConnection conn=new SqlConnection(connstring);

3、写出SQL语句

string sele="sele * from table_Name where ID between 10 and 14";

4、创建Command对象,打开连接

SqlCommand cmd=new SqlCommand(sele,conn);

conn.Open();

5、创建DataReader对象,提取数据

SqlDataReader dr=cmd.ExecuteRead();

6、读取数据

dr.Read();

7、完成之后,关闭连接

conn.Close();

 

执行脱机模式下的链接查询:

脱机模式包括:DataSet,DataTable,DataColumn,DataRow,DataRelation和Constraint。

1、连接字符串的定义:

string connstring="DataSource=IP;UserId=sa;Password=123;Initial Catalog=DB_Name";

2、写出SQL语句

string sele="sele * from table_Name where ID between 10 and 14";

3、创建DataAdapter

SqlDataAdapter da=new SqlDataAdapter(connstring, sele);

4、定义DataSet,并填充数据

DataSet ds=new DataSet("F_ds");

Da.Fill(ds,"employ");

5、定义DataTable,并填充数据

DataTable dt=new DataTable("newTable");

ds.Tables.Add(dt);

6、遍历:

foreach(DataTable dt in dataSet.Tables)

foreach(DataRow dr in dt.Rows)

foreach(DataColumn dc in dr.Table.Columns)

{

Console.WriteLine(dr[dc]);

}

7、其中可以定义新的DataRow或者DataColumn。并对其数据进行修改更新

 

 

 

执行层次化数据查询:

DataRelation类用于表示两个DataTable对象之间的关系。利用这种关系可以更好的去实现对关系数据的操作。当差ungjianyigeDataRelation的时候应该为其提供一个名称,这样就可以再集合中定位该对象,并制定该关系的父列与子列。

DataRelation一个最重要的用途是在不同的DataTable之间查找关系数据,不过DataRelation并不直接处理这项任务,二十通过国DataRow对象的GetChildRows()、GerParentRows()和GetParentRow()方法实现。在调用任意一个DataRow对象中的这些方法时,需要制定一个DataRelation为其一个参数。

 

Da.FillSchema(ds,SchemaType.Source,string):将名为"string"的DataTable添加到指定的 DataSet 中,并根据指定的 SchemaType 配置架构以匹配数据源中的架构。此处填充的仅仅是框架,没有数据。

ds:表示要将结构插入的DataSet

string:用于表映射的源表的名称

 

        成员名称         说明

         Mapped   将任何现有的表映射应用到传入架构。用转换的架构配置 DataSet。

 

 

         Source      忽略 DataAdapter 上的任何表映射。使用传入架构配置 DataSet,而不应用任何转换。

 

Da.Fill(ds,string)

DataSet 包含多个 DataTable 对象,而这些对象的名称只有大小写不同。在这种情况下,Fill 执行区分大小写的比较以查找相应的表,如果不存在完全匹配的表,则新建一个。如果存在,但数据不完全不匹配,则更新。

DataRelation (String, DataColumn1, DataColumn2) String为名称,DataColumn1为父级,DataColumn2为子级

DataRelation dr=new DataRelation (String, DataColumn1, DataColumn2);

Ds.Relations.Add(dr);

……**.GetChildRows(dr);……

注意:如果处理的是一种多对多的关系,可以采用DataRow的GetParentRows()方法,返回包含所有父级的一个数组。

执行带参数的数据查询:

当使用SQL Server数据提供程序时,查询参数必须是命名参数,参数名必须唯一,而添加到ParameterCollection的顺序并不重要。注意的是.NET SQL Server数据提供程序不支持通用的参数标记?,而需要带有@前缀的命名参数。

参数查询的步骤:

1、写出SELE语句:

string sele="SELECT * FROM Table_Name FOR TotlValue>@TT";

2、连接

conn;

3、Command

cmd;

2、添加参数到Command对象中。

cmd.Parameters.Add("@TT",SqlDbType.Money);

3.设定参数的值:

cmd.Parameters["@TT"].Value=http://www.mamicode.com/2000;

4、DataAdapter

Da=new SqlDataAdapter(cmd);

现在数据已经到da里面了,下面的参照脱机工作方式就行了。

 

存储过程;

 

查找过滤与排序:

 

使用Command更新数据库:

1)创建Command对象

2)定义SQL语句,并将该语句赋值给Command对象的CommandText属性

3)如果SQL语句包含参数,则通过SqlCommand对象的参数属性的Add()方法,对其添加参数。并利用参数属性的Value属性对其赋值。

4)Command.ExecutrNonQuery()方法,执行更新

 

使用commandBuilder对象生成更新逻辑

如果实力话一个CommandBuilder对象,并将它同一个DataAdapter对象关联起来,则CommandBuilder就会尝试根据DataAdapter对ixangdeSelectCommand中包含的查询生成更新逻辑。

作用:

DataAdapter 对象在数据发生变化的时候,并不能自动产生数据库系统所需要的 Transact-SQL(事务) 语句,如果不使用 CommandBuilder 而使用 Update 方法,这是不会成功的。而 CommandBuilder 对象能为单个表的数据改变自动产生 Transact-SQL 语句。

UpdateCommand、InsertCommand、DeleteCommand等命令对象的CommandText。一般来说,当使用DataAdapter的Update方法时,DataAdapter都会把相应的工作分给这些命令对象来处理,也就是说,要用数据适配器的Update方法,就必须配置好命令对象。手工配置这些命令对象工作量(代码量)比较大,而且还不一定正确,所以微软提供了自动生成命令的专用工具CommandBuilder。

虽然利用CommandBuilder对象可以节省一些代码编写工作,但使用此对象时,要记住以下局限。 

DataAdpater对象的SelectCommand命令只能从单表中读取。

SelectCommand中使用的数据库表必须包含主键。

表格主键必须放在SelectCommand中。

CommandBuilder生成命令需要额外的时间,因为它要检查数据库。

注意:由于CommandBuilder会使程序性能下降,因此应避免大数据量批量更新使用,为了提高性能,应使用存储过程。

 

ADO.NET对象模型