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类包含了直接连接数据源的类与脱机情况下操纵数据的类。
- Connection对象用来和数据库建立连接。在ADO.NET以单个Connection类的形式建模。Connection类表示一个数据源的单个连接,但不代表单个调用。
常用属性:
ConnectionString属性:获取用来连接到数据库的链接字符串
DataBase属性:在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符串中指定的数据库名。
DataSource属性:获取或设置对象,数据绑定控件从该对象中检索其数据项列表
IsLocalConnection:是否是本地连接
State属性:是一个枚举类型的值,用来表示同当前数据库的连接状态。
属 性 值 | 对 应 含 义 |
Broken | 该连接对象与数据源的连接处于中断状态。只有当连接打开后再与数据库失去连接才会导致这种情况。可以关闭处于这种状态的连接,然后重新打开 |
Closed | 该连接对象正在与数据源连接 |
Connecting | 该连接对象正在与数据源连接 |
Executing | 该连接对象正在执行数据库操作的命令 |
Fetching | 该连接对象正在检索数据 |
Open | 该连接处于打开状态 |
常用方法:
Close():
Open():
BeginTransaction():用于创建Transaction语句
- Command对象:在连接好数据源之后,命令操作包括从数据存储区检索或对数据存储
区进行插入、更新、删除等操作。在ADO.NET没有Command对象,不能对数据库进行任何实际的操作。操作实现的方法可采用SQL语句,也可以采用存储过程。
常用属性:
CommandType:获取或设置Command对象要执行的类型
CommandText:获取或设置数据源执行的SQL语句或存储过程名或表名
CommandTimeOut:获取或设置在种植对执行命令的尝试并生成错误报告的等待时间
Connection:获取或设置Command对象使用的Connection对象的名称
常用方法:
ExecuteNonQuery():执行SQL语句并返回受影响的函数
ExecuteScalar():执行查询,并返回产寻所返回的结果集中的第一行的第一列,忽略其他行与列。
ExecuteReader():执行并返回数据集的SELECT语句
- 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)综合使用上述两方法,可以获得数据表里列名和列的字段。
- 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():提交
- Parameter对象:
常用属性
ConvertEmptyStringToNull:获取或设置一个值,该值指示在 Parameter 对象绑定到的值为 String.Empty 时是否应将其转换为 空引用(在 Visual Basic 中为 Nothing)。
DefaultValue:指定参数的默认值(如果调用 Evaluate 方法时参数绑定到的值未被初始化)。
Direction:指示 Parameter 对象是否用于将值绑定到控件,或者是否可以使用控件更改值。
创建一个内存表:auto.Columns.Add("ID");auto.Columns.Add("Name");
for(int i=1;i<=10;i++) auto.Rows.Add(new object[]{i,"baibaoqing"});
5、访问其中的数值:DataTable.Rows[index] ["columnName"]。
CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。
DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet".如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False.
Relations:返回一个DataRelationCollection对象。
Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。
AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。
HasChange:表示DataSet中是否包含挂起更改的DataRow对象。
GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。
Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。
Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好
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";
DataTable new_Table=view.ToTable("MyTable",true,"id","name");
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);
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)
1、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique
2、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints
通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。
3、用SqlDataAdapter.Fill模式来检索模式信息
string connstring="DataSource=IP;UserId=sa;Password=123;Initial Catalog=DB_Name";
SqlConnection conn=new SqlConnection(connstring);
string sele="sele * from table_Name where ID between 10 and 14";
SqlCommand cmd=new SqlCommand(sele,conn);
SqlDataReader dr=cmd.ExecuteRead();
脱机模式包括:DataSet,DataTable,DataColumn,DataRow,DataRelation和Constraint。
string connstring="DataSource=IP;UserId=sa;Password=123;Initial Catalog=DB_Name";
string sele="sele * from table_Name where ID between 10 and 14";
SqlDataAdapter da=new SqlDataAdapter(connstring, sele);
DataSet ds=new DataSet("F_ds");
DataTable dt=new DataTable("newTable");
7、其中可以定义新的DataRow或者DataColumn。并对其数据进行修改更新
成员名称 | 说明 | |
Mapped | 将任何现有的表映射应用到传入架构。用转换的架构配置 DataSet。 | |
Source | 忽略 DataAdapter 上的任何表映射。使用传入架构配置 DataSet,而不应用任何转换。 |
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会使程序性能下降,因此应避免大数据量批量更新使用,为了提高性能,应使用存储过程。