一、ADO.NET概述
生成能有效管理来自多个数据源的组件;在断开连接情形中,能提供在多层结构中请求、更新、协调数据的功能。
其中心构件是DataSet。
ADO.Net的主要成员包含在Data命名空间,Data.SqlClient、Data.Odbc、Data.OleDb则作为数据源的提供者,通过DataAdapter桥接器与DataSet关联。
以下来源于MSDN(将更改的DataRowCollection与原DataSet合并:是不是也是离线操作的基础?):
在典型的多层实现中,用于创建和刷新 DataSet 并依次更新原始数据的步骤包括:
1. 通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
2. 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
3. 调用 GetChanges 方法以创建只反映对数据进行的更改的第二个 DataSet。
4. 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。
5. 调用 Merge 方法将第二个 DataSet 中的更改合并到第一个中。
6. 针对 DataSet 调用 AcceptChanges。或者,调用 RejectChanges 以取消更改。
二、两种操作数据库的方式
1、.NET的设计意图----通过SqlClient使用DataSet
Data命名空间相当于一个虚拟的数据库,或者说是真实DB的封装。我们对数据库的操作,应该尽量在这里进行。注意它不是真实DB的映射。
如果把Data与DBMS看作两个岛,那么Data.SqlClient命名空间的作用相当一座桥。
2、直接使用SqlClient
由于SqlClient提供了SqlCommand,可以直接对DB进行操作,可以执行任何SQL语句。SqlClient不能滥用。
三、Data命名空间
中心构件是DataSet。可以近似地把DataSet看作数据库DataBase。
DataSet中可以有表、表间关联,表内设置主键,每个表都可以有多个对应的视图,操作上可以定义数据库元素(对应DDL),可以操作数据库元素(对应DML),各种操作可以引发相应的异常,这与SQL几乎是一一对应的。当然了,这里是无法建立索引的。在学习中应该注意,ADO.NET是如何利用索引的。
1、数据定义
基本类:DataTable、DataColumn。(只要明白了DataSet的作用,就明白了为什么DataSet没有数据库定义类。)
1.1 表定义
表定义:DataTable,DataTableCollection。
属性定义:DataColumn,DataColumnCollection。
主键定义:ForeinKeyConstraint,注意它是一个列数组型。
约束定义:Constraint;ConstraintCollection;UniqueConstraint。
默认值:col1.DefaultValue= "myDefaultValue";
例1:
private void DataDefine
{
//表定义
DataTable custTable = new DataTable(“Customers”);
//列定义
custTable.Columns.Add(“id”,typeof(“int”);
custTable.Columns.Add(“name”,typeof(“string”);
custTable.Columns.Add(“address”,typeof(“string”);
//主键定义与约束定义,注意与DBMS不同的是,必须单独设置unique约束,因为主键其实也是unique的特殊情况。这与SQL server中当主键是非聚簇索引的设置完全相同。
custTable.Columns[“id”].Unique = true;
custTable.PrimaryKey = new DataColumn [] {custTable.Columns[“id”]};
}
1.2 表间关联定义
DataRelation,DataRelationCollection。
例2:
private void CreateRelation() {
// Get the DataColumn objects from two DataTable objects in a DataSet.
DataColumn parentCol;
DataColumn childCol;
// Code to get the DataSet not shown here.
parentCol = DataSet1.Tables["Customers"].Columns["CustID"];
childCol = DataSet1.Tables["Orders"].Columns["CustID"];
// Create DataRelation.
DataRelation relCustOrder;
relCustOrder = new DataRelation("CustomersOrders", parentCol, childCol);
// Add the relation to the DataSet.
DataSet1.Relations.Add(relCustOrder);//Relations类型是DataRelationCollection。
}
2、数据操纵
在此之前先介绍DataRow对象。与此相关的类有:DataRow、DataRowCollection。
DataRow表示DataTable中的一行数据。
DataRowCollection表示DataTable中的所有行。
这里涉及到DataRow的四个版本:(DataRowVersion的枚举)Original(更改之前的值,或BeginEdit之前的值)、Current(当前最新值)、Default(缺省值)、Proposed(更改某条记录但未确认时的更改值)。可参见MSDN中关于DataRowView类的例子。
DataRow的状态转换关系:设一个表T只有一条记录R1,一个列C1,默认值为0,即Default=Original=Current=0,Proposed引发异常。à修改该值为1,但不提交,Defalut=Original=0;Currnet=Propsed=1。à提交修改,Default=Original=Current=1,Proposed引发异常。à新增记录R2,但不提交,Defalut=1、0(R1、R2),Original=0(R1);Current=1、0(R1、R2),Propsed引发异常。即ProPosed只在对修改但未更新的记录有效。
调用:DataSet[col,DataRowVersion]。其中I是列号。
2.1 查询
没有专用查询类。
2.2 插入数据
必须先用NewRow()把表结构复制到DataRow中。例:
DataRow newRow = new DataTable.NewRow();
NewRow[“name”]=”temp”;
DataTable.AddRow(newRow);
2.3 更改数据
用赋值语句实现,没有新东东。
2.4 删除数据
DataRow.Delete()。注意下面的例子(在接受删除之间可以恢复):
DataRowCollection Rc = custTable.Rows;
Rc[0].Delete(); //删第0行
Rc[1].Delete(); //删第1行
Rc[2].Delete(); //删第2行
Rc[0].RejectChanges(); //恢复第0行
CustTable.AcceptChanges(); // 接受第 1 、 2 行的删除操作