ADO.NET
一、
ADO.NET
基础
1
何为
ADO.NET
ADN.NET
被设计成为遵循一般的更没有面向数据库缺陷的数据库访问准则,
ADO.NET
搜集了所有的和数据访问有关的类,这些类由一些数据容器对象组成,这项对象具有一般的数据处理能力
---indexing,sorting,Viewing,ADO.NET
是为
.NET
数据库应用程序定义的开发办法,
ADO.NET
是一个对数据库的整套设计环境,而不是象
ADO
那样只是围绕着数据访问和数据处理的。
ADO.NET 和 ADO 大不一样,它是一个新的数据访问程序模型,需要透彻的理解。然而,一旦用户使用了 ADO.NET ,将会发现所有的 ADO 技巧,对用户在 ADO.NET 环境下编程是大有帮助的。
ADO.NET 和 ADO 大不一样,它是一个新的数据访问程序模型,需要透彻的理解。然而,一旦用户使用了 ADO.NET ,将会发现所有的 ADO 技巧,对用户在 ADO.NET 环境下编程是大有帮助的。
ADO.NET
组件设计用来允许在
.NET Framework
中访问和操作数据。
2 ADO.NET
的优点
(
1
)互操作性:数据以
XML
格式储存,不同工具开发的组件可以通过数据存储进行通信。
(
2
)性能:因数据以
XML
格式储存,数据传送无需转换,提高了数据访问的效率。
(
3
)可扩展性:
ADO.NET
是一种断开式数据结构,也就是说,从数据库中检索到数据缓存在本机上,只有在操作或更新数据时才需要重新建立连接。这样可以提高应用程序的能务,而不需增加维护成本。
(
4
)标准化:位于数据集中的数据以
XML
形式保存并在不同的层之间传送。因此使得数据统一成为可以。
(
5
)可编辑性:在
ADO.NET
中可使用
C#
和
VB.NET
等语言编写程序,因此向开发人员提供情报了强类型化环境,这对于
ADO
是不可能的。
3
ADO.NET
的结构
(1)
ADO.NET
基本组件
ADO.NET
有两个主要组件:
DateSet
和
.Net
数据提供程序。
.NET
数据提供程序包括:
Connection
:
建立与特定数据源的连接。
Command
:
对数据源执行命令。公开
Parameters
,并且可以从
Connection
在
Transaction
的范围内执行。
DataReader
:
从数据源中读取只进且只读的数据流。
DataAdapter
:
用于管理与数据的连接、执行
SQL
命令并向数据集返回数据。
(2)
ADO.NEET
两种数据库连接方式
Connection+Command+DataReader
Connection+DataSet+DataAdpter
(3)
命名空间
要使用
SQL .Net Frmaework
数据提供程序,必须引入以下两个命名空间。
System.Data
:
System.Data.SqlData
:
二、
Connection
对象
建立与特定数据源的连接。
String
conn = "server=.;database=pet;uid=sa;pwd=sa";
SqlDataAdapter
da=new SqlDataAdapter("select * from v_Pet",sqlConn)
三、
Command
对象
对数据源执行命令。公开
Parameters
,并且可以从
Connection
在
Transaction
的范围内执行。
Command
对象
主要属性:
Connection :包含数据仓库连接的细节
CommandText :要运行的命令
CommandType :命令的类型 Sql 字符或存储过程的名称
Text 表示文本字符串 sql
TableDirect 表示表名
StoredProcedure 表示存储过程的名称
Parameters : Parameters 对象的一个集合
Connection :包含数据仓库连接的细节
CommandText :要运行的命令
CommandType :命令的类型 Sql 字符或存储过程的名称
Text 表示文本字符串 sql
TableDirect 表示表名
StoredProcedure 表示存储过程的名称
Parameters : Parameters 对象的一个集合
Command
对象
主要方法:
四、
DataReader
对象
从数据源中读取只进且只读的数据流。
DataReader
对象的特点
1
只读数据流
2
只能向前读取一条数据
3
一起保持连接状态
4
不能用
new
实例化,用
ExecuteReader()
方法实例化。
5
读取方法
DataReader["filedName"]
DataReader
对象的主要属性
FildCount
:返回当前行中的列数
IsClosed
:表示
DataReader
是否关闭
RecordsAffected:
表示执行
SQL
语句之后修改、插入或删除的行数。
DataReader
对象的主要方法
Close:
用于关闭
DataReader
对象
Read:
使
DataReader
前移到下一条记录。
五、
DataAdapter
对象
用于管理与数据的连接、执行
SQL
命令并向数据集返回数据。
DataAdpater
是与数据集(
DataSet
)一起使用的对象,它包括在和一个数据库连接后用于填充数据集和更新数据源的一组数据命令。
DataAdapter
对象的主要方法
Fill
:向
DataSet
中表结构里填充数据,若
DataSet
里面没有表结构
(Schema)
的话,同时创建表结构。
da.FillSchema(ds);
FillSchem
:向
DataSet
中创建和数据源一致的表结构。
da.FillSchema(ds,SchemaType.Source);
Update
:将
DataSet
中的数据提交到数据库。
DataAdapter和Command的区别
>> Command 主要用于运行命令
>> DataAdapter 主要用于为多个命令提供一个存储空间,在数据仓库和 DataSet 之间提供双向交互。
>> Command 主要用于运行命令
>> DataAdapter 主要用于为多个命令提供一个存储空间,在数据仓库和 DataSet 之间提供双向交互。
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);则是对adapter的这四个属性的进入
了预编译.
六、
DataSet
对象
数据集
DataSet
相当于一个临时的数据库,它是断开式的、存储于内存中的。
数据集
DataSet
是由数据行和列、约束和有关表对表中数据关系的信息组成的
0
个或多个表对象的集合。这些数据缓存到本地机上,不需要与数据库持续连接。
数据集
DataSet
有趣的一点是既可以容纳数据库的数据,也可以容纳非数据库的数据。
数据集
DataSet
不与数据库直接交互,它只是数据的容器。因此,数据庥独立于任何数据
,
并且可以用于存储各种数据类型,如数据库中的数据以及
Excel
电子表格等非数据库数据。
数据集
DataSet
的结构
数据集DataSet有两种类型:
类型化数据集:在数据填充之前就知道它自己能容纳什么样的数据。
非类型化数据集:在数据填充之前不知道它自己能容纳什么样的数据。非类型化数据集中的表和列以集合形式公开。一般我们手动创建的数据集都是非类型化数据集!
访问方式:
ds.Tables["
表名"
].Rows[0]["
列名"
]
数据集
DataSet
主要属性:
DataSetName
:用于获取或设置当前数据集的名称
Tables
:用于检索数据集中包含的表的集合
数据集
DataSet
主要方法:
Clear
:清除数据集中包含的所有表的所有行
HasChanges
:返回一个布尔值,表示是否已更改了数据集。
DataSet
对象中的
DataTable
对象
数据集中的每个
DataTable
对象表示一个从数据库检索到的表,每个表的列和约束用于定义
DataTable
的结构。
DataTable
主要属性:
Columns
:表示列的集合或
DataTable
包含的
DataColumn
Constraints
:表示指定
DataTable
的约束集合
DataSet
:表示
DataTable
所属的数据集,数据集的名称存储在该属性中
.
PrimaryKey
:表示作为
DataTable
主键的字段或
DataColumn
Rows
:表示行的集合或
DataTable
包含的
DataRow.
DataTable
主要方法:
NewRow
:添加一个新的
DataRow
AcceptChanges
:提交对该表所作的修改。
DataTable
对象中的
DataColumn
对象:
DataColumn
对象定义
DataColumn
的列,
DataTable
中的
Columns
属性包含对
DataColumn
对象的引用。
DataColumn
主要属性:
AllowDBNull
:此列是否允许为
null
值
ColumnName
:
DataColumn
的名称
DataType
:
DataColumn
对象中存储的数据类型
DefaultValue
:新建行时该列的默认值
Table
:
DataColumn
所属的
DataTable
的名称
Unique
:
DataColumn
的值是否必须是唯一的。
DataTable
对象中的
DataRow
对象:
DataRow
对象表示
DataTable
中的实际数据,而且
DataRow
对象中的数据是可以改变的。
DataRow
主要属性:
Item
:
DataRow
的指定列中存储的值
RowState
:行的当前状态,有
Added
、
Deleted
、
Detached
、
Modified
、
Unchanged
。
DataRow
主要方法:
AcceptChanges
:提交自上次调用
AcceptChanges
之后对该行所做的修改
Delete
:删除
DataRow
RejectChanges
:拒绝自上次调用
AcceptChanges
之后对该
DataRow
所做的修改
DataView
对象
DataView
是
DataTable
中存储的数据的表示层,它提供对
DataTable
进行排序、筛选和搜索的自定义视图。它最得要的作用是允许
WinForms
控件进行数据绑定。
DataRow
主要属性:
Item
:用于从指定的表中获取一行数据
RowFilter
:用于获取或设置表达式,该表达式用于筛选可以在
DataView
中查看的行。
RowStateFilter
:用于获取
DataView
的行状态筛选器。
Added
、
CurrentRows
等。
Table
:表示源
DataTable
DataRow
主要方法:
AddNew
:用于向
DataView
添加新行
Delete
:用于删除指定索引处的行
/**/
///<summary>
///应用DataSet DataTable
/// DataColumn DataRow创建的数据集
///</summary>
///<returns>数据集</returns>
public DataSet CreateDataSet()
... {
//建立数据集studentDS
DataSet ds = new DataSet();
//建立表Students
DataTable dt = new DataTable("student");
//建立表字段:学号
DataColumn dcStudentNo = dt.Columns.Add("学号", typeof(Int32));
dcStudentNo.AllowDBNull = false;
dcStudentNo.DefaultValue = 25;
//建立表字段:姓名
dt.Columns.Add("姓名",typeof(string));
//建立表字段:成绩
dt.Columns.Add("成绩",typeof(double));
//新建行dr,并向表dt增加一行
DataRow dr = dt.NewRow();
dr["学号"] = "101";
dr["姓名"] = "张三";
dr["成绩"] = "55";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["学号"] = "102";
dr["姓名"] = "李四";
dr["成绩"] = "88";
dt.Rows.Add(dr);
dr = dt.NewRow();
//dr["学号"] = "119";
dr["姓名"] = "王五";
dr["成绩"] = "79";
dt.Rows.Add(dr);
//创建主健列
dt.PrimaryKey = new DataColumn[]
...{
dt.Columns["学号"],
dt.Columns["姓名"]
};
//把表dt添加到数据集ds中
ds.Tables.Add(dt);
return ds;
}
///应用DataSet DataTable
/// DataColumn DataRow创建的数据集
///</summary>
///<returns>数据集</returns>
public DataSet CreateDataSet()
... {
//建立数据集studentDS
DataSet ds = new DataSet();
//建立表Students
DataTable dt = new DataTable("student");
//建立表字段:学号
DataColumn dcStudentNo = dt.Columns.Add("学号", typeof(Int32));
dcStudentNo.AllowDBNull = false;
dcStudentNo.DefaultValue = 25;
//建立表字段:姓名
dt.Columns.Add("姓名",typeof(string));
//建立表字段:成绩
dt.Columns.Add("成绩",typeof(double));
//新建行dr,并向表dt增加一行
DataRow dr = dt.NewRow();
dr["学号"] = "101";
dr["姓名"] = "张三";
dr["成绩"] = "55";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["学号"] = "102";
dr["姓名"] = "李四";
dr["成绩"] = "88";
dt.Rows.Add(dr);
dr = dt.NewRow();
//dr["学号"] = "119";
dr["姓名"] = "王五";
dr["成绩"] = "79";
dt.Rows.Add(dr);
//创建主健列
dt.PrimaryKey = new DataColumn[]
...{
dt.Columns["学号"],
dt.Columns["姓名"]
};
//把表dt添加到数据集ds中
ds.Tables.Add(dt);
return ds;
}
七、
CommandBuilder
对象
自动生成单表命令
OleDbCommandBuilder objBuilder
objBuilder = new OleDbCommandBuilder(DataAdapter)
表示告诉命令生成器可以在哪儿取到 SelectCommand, 以建立其他的命令 .
DataAdapter.UpdateCommand = objBuilder.GetUpdateCommand();
DataAdapter.InsertCommand = objBuilder.GetInsertCommand();
DataAdapter.DeleteCommand = objBuilder.GetDeleteCommand();
注意在这种情况下, SelectCommand 必需带有一个主键字段
OleDbCommandBuilder objBuilder
objBuilder = new OleDbCommandBuilder(DataAdapter)
表示告诉命令生成器可以在哪儿取到 SelectCommand, 以建立其他的命令 .
DataAdapter.UpdateCommand = objBuilder.GetUpdateCommand();
DataAdapter.InsertCommand = objBuilder.GetInsertCommand();
DataAdapter.DeleteCommand = objBuilder.GetDeleteCommand();
注意在这种情况下, SelectCommand 必需带有一个主键字段
下面的示例结合 SqlDataAdapter 和SqlConnection,使用SqlCommand从数据源中选择行。向该示例传递了一个连接字符串、一个查询字符串(它是一个 Transact-SQL SELECT 语句)和一个数据库表名称字符串。然后该示例创建一个 SqlCommandBuilder
public
static
DataSet SelectSqlRows(
string
connectionString,
string queryString, string tableName)
... ... {
using (SqlConnection connection = new SqlConnection(connectionString))
......{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
connection.Open();
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tableName);
//code to modify data in DataSet here
//Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet, tableName);
return dataSet;
}
}
string queryString, string tableName)
... ... {
using (SqlConnection connection = new SqlConnection(connectionString))
......{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
connection.Open();
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tableName);
//code to modify data in DataSet here
//Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet, tableName);
return dataSet;
}
}