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类包含了直接连接数据源的类与脱机情况下操纵数据的类。
常用属性:
ConnectionString属性:获取用来连接到数据库的链接字符串
DataBase属性:在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符串中指定的数据库名。
DataSource属性:获取或设置对象,数据绑定控件从该对象中检索其数据项列表
IsLocalConnection:是否是本地连接
State属性:是一个枚举类型的值,用来表示同当前数据库的连接状态。
属 性 值 |
对 应 含 义 |
Broken |
该连接对象与数据源的连接处于中断状态。只有当连接打开后再与数据库失去连接才会导致这种情况。可以关闭处于这种状态的连接,然后重新打开 |
Closed |
该连接对象正在与数据源连接 |
Connecting |
该连接对象正在与数据源连接 |
Executing |
该连接对象正在执行数据库操作的命令 |
Fetching |
该连接对象正在检索数据 |
Open |
该连接处于打开状态 |
常用方法:
Close():
Open():
BeginTransaction():用于创建Transaction语句
区进行插入、更新、删除等操作。在ADO.NET没有Command对象,不能对数据库进行任何实际的操作。操作实现的方法可采用SQL语句,也可以采用存储过程。
常用属性:
CommandType:获取或设置Command对象要执行的类型
CommandText:获取或设置数据源执行的SQL语句或存储过程名或表名
CommandTimeOut:获取或设置在种植对执行命令的尝试并生成错误报告的等待时间
Connection:获取或设置Command对象使用的Connection对象的名称
常用方法:
ExecuteNonQuery():执行SQL语句并返回受影响的函数
ExecuteScalar():执行查询,并返回产寻所返回的结果集中的第一行的第一列,忽略其他行与列。
ExecuteReader():执行并返回数据集的SELECT语句
常用属性:
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)综合使用上述两方法,可以获得数据表里列名和列的字段。
常用属性:
IsolationLevel:获取事务的隔离级别。
TransactionInformation:检索有关某个事务的附加信息。
Current:获取或设置环境事务。
常用方法:
Clone():创建事务的克隆。
Dispose():释放由该对象占用的资源。
Equals():确定此事务和指定的对象是否相等。
op_Equality():测试两个指定的 Transaction 实例是否等效。静态
op_Inequality():返回一个值,该值指示 Transaction 的两个实例是否相等。静态
ReferenceEquals() :确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)静态
Rollback():已重载。 回滚(中止)事务。
ToString() :返回表示当前 Object 的 String。 (从 Object 继承。)
Commit():提交
常用属性
ConvertEmptyStringToNull:获取或设置一个值,该值指示在 Parameter 对象绑定到的值为 String.Empty 时是否应将其转换为 空引用(在 Visual Basic 中为 Nothing)。
DefaultValue:指定参数的默认值(如果调用 Evaluate 方法时参数绑定到的值未被初始化)。
Direction:指示 Parameter 对象是否用于将值绑定到控件,或者是否可以使用控件更改值。
Name:获取或设置参数的名称。
Size:获取或设置参数的大小。
Type:获取或设置参数类型。
常用方法:
Clone:返回当前 Parameter 实例的副本。
Evaluate:更新并返回 Parameter 对象的值。
ToString :将此实例的值转换为其等效的字符串表示。
常用命令:
SelectCommand:用来提取数据源中的记录
InsertCommand:用来想数据源中插入一条记录
UpdateCommand:用来更新数据源中的数据
DeleteCommand:用来删除数据源中的记录
Fill():参数为DataSet对象。DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。 但是,对于大量的查询结果,它可能并不是首选的分页方法,因为 DataAdapter 虽然仅使用所请求的记录来填充目标 DataTable 或 DataSet,但仍会使用返回整个查询的资源。 若要在从数据源中返回一页数据时不使用返回整个查询的资源,请为查询指定附加条件,使返回的行数减少到只返回所需的行。例:adapter.Fill(dataSet, currentIndex, pageSize, "Orders");
ADO.NET脱机对象:
用法:
创建一个内存表:auto.Columns.Add("ID");auto.Columns.Add("Name");
for(int i=1;i<=10;i++) auto.Rows.Add(new object[]{i,"baibaoqing"});
DataTable 的复制和克隆:
DataTable copy_Table=auto.Copy()
DataTable clone_Table=auto.Clone();
clone_Table.ImportRow(auto.Rows[0]);
foreach(DataRow dr in auto.Rows)
foreach(DataColumn dc in auto.Colmns){OPERATE_CODES}
5、访问其中的数值:DataTable.Rows[index] ["columnName"]。
常用方法:
Delete():实际上并不从DataRow表的Row集合中删除该DataRow.当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。(逻辑删除)
常用属性:
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方法发生一个异常时触发。
常用方法:
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 表示显示不同的值,将相同的行删除
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 |
||
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=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会使程序性能下降,因此应避免大数据量批量更新使用,为了提高性能,应使用存储过程。