初学ADO.NET手记1(Data命名空间)

一、ADO.NET概述

生成能有效管理来自多个数据源的组件;在断开连接情形中,能提供在多层结构中请求、更新、协调数据的功能。

其中心构件是DataSet

ADO.Net的主要成员包含在Data命名空间,Data.SqlClientData.OdbcData.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的映射。

如果把DataDBMS看作两个岛,那么Data.SqlClient命名空间的作用相当一座桥。

2、直接使用SqlClient

       由于SqlClient提供了SqlCommand,可以直接对DB进行操作,可以执行任何SQL语句。SqlClient不能滥用。

 

三、Data命名空间

中心构件是DataSet。可以近似地把DataSet看作数据库DataBase

DataSet中可以有表、表间关联,表内设置主键,每个表都可以有多个对应的视图,操作上可以定义数据库元素(对应DDL),可以操作数据库元素(对应DML),各种操作可以引发相应的异常,这与SQL几乎是一一对应的。当然了,这里是无法建立索引的。在学习中应该注意,ADO.NET是如何利用索引的。

1、数据定义

    基本类:DataTableDataColumn。(只要明白了DataSet的作用,就明白了为什么DataSet没有数据库定义类。)

1.1 表定义

表定义:DataTable,DataTableCollection

属性定义:DataColumnDataColumnCollection

主键定义: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 表间关联定义

       DataRelationDataRelationCollection

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对象。与此相关的类有:DataRowDataRowCollection

       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=10R1R2,Original=0R1;Current=10R1R2),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 行的删除操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值