[No0000BC]ADO.NET中的几个主要对象
ADO 指 ActiveX 数据对象(ActiveX Data Objects)。
从一个 ASP 页面内部访问数据库的通常的方法是:
- 创建一个到数据库的 ADO 连接
- 打开数据库连接
- 创建 ADO 记录集
- 从记录集提取您需要的数据
- 关闭记录集
- 关闭连接
到 MS Access 数据库的 ODBC 连接:
- 打开控制面板中的 ODBC 图标
- 选择系统 ODBC 选项卡
- 点击 ODBC 选项卡中的添加按钮
- 选择 Driver to Microsoft Access,然后点击完成按钮
- 在下一个窗口中点击"选择"按钮来定位数据库
- 为此数据库赋予一个数据源名称(Data Source Name,DSN)
- 点击"确定"
ADO 连接对象(ADO Connection Object)
ADO 连接对象用来创建到某个数据源的开放连接。通过此连接,您可以对此数据库进行访问和操作。如需读取数据库的数据,那么其中的数据必须首先被载入一个记录集中。
创建一个 ADO 表记录集(ADO Table Recordset)
在 ADO 数据库连接创建之后,接下来就可以建立一个 ADO 记录集了。
创建一个 ADO SQL 记录集 (ADO SQL Recordset)
ADO 记录集对象(ADO Recordset Object)。ADO Recordset 对象可被用来容纳来自数据库表的记录集。
ADO 对象
Command 对象
ADO Command 对象用于执行面向数据库的一次简单查询。此查询可执行诸如创建、添加、取回、删除或更新记录等动作。如果该查询用于取回数据,此数据将以一个 RecordSet 对象返回。这意味着被取回的数据能够被 RecordSet 对象的属性、集合、方法或事件进行操作。Command 对象的主要特性是有能力使用存储查询和带有参数的存储过程。
ProgID set objCommand=Server.CreateObject("ADODB.command")
Connection 对象
ADO Connection 对象用于创建一个到达某个数据源的开放连接。通过此连接,您可以对一个数据库进行访问和操作。如果需要多次访问某个数据库,您应当使用 Connection 对象来建立一个连接。您也可以经由一个 Command 或 Recordset 对象传递一个连接字符串来创建某个连接。不过,此类连接仅仅适合一次具体的简单的查询。
ProgID set objConnection=Server.CreateObject("ADODB.connection")
Error 对象
ADO Error 对象包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。ADO 会因每次错误产生一个 Error 对象。每个 Error 对象包含具体错误的详细信息,且 Error 对象被存储在 Errors 集合中。要访问这些错误,就必须引用某个具体的连接。
Field 对象
ADO Field 对象包含有关 Recordset 对象中某一列的信息。Recordset 中的每一列对应一个 Field 对象。
ProgID set objField=Server.CreateObject("ADODB.field")
Parameter 对象
ADO Parameter 对象可提供有关被用于存储过程或查询中的一个单个参数的信息。Parameter 对象在其被创建时被添加到 Parameters 集合。Parameters 集合与一个具体的 Command 对象相关联,Command 对象使用此集合在存储过程和查询内外传递参数。参数被用来创建参数化的命令。这些命令(在它们已被定义和存储之后)使用参数在命令执行前来改变命令的某些细节。例如,SQL SELECT 语句可使用参数定义 WHERE 子句的匹配条件,而使用另一个参数来定义 SORT BY 子句的列的名称。
有四种类型的参数:input 参数、output 参数、input/output 参数 以及 return 参数。语法:
objectname.property
objectname.method
Property 对象
ADO 对象有两种类型的属性:内置属性和动态属性。内置属性是在 ADO 中实现并立即可用于任何新对象的属性,此时使用 MyObject.Property 语法。它们不会作为 Property 对象出现在对象的 Properties 集合中,因此,虽然可以更改它们的值,但无法更改它们的特性。
ADO Property 对象表示 ADO 对象的动态特性,这种动态特性是被 provider 定义的。每个与 ADO 对话的 provider 拥有不同的方式与 ADO 进行交互。所以,ADO 需要通过某种方式来存储有关 provider 的信息。解决方法是 provider 为 ADO 提供具体的信息(动态属性)。ADO 把每个 provider 属性存储在一个 Property 对象中,而 Property 对象相应地也被存储在 Properties 集合中。此集合会被分配到 Command 对象、Connection 对象、Field 对象 或者 Recordset 对象。例如,指定给提供者的属性可能会指示 Recordset 对象是否支持事务或更新。这些附加的属性将作为 Property 对象出现在该 Recordset 对象的 Properties 集合中。
ProgID set objProperty=Server.CreateObject("ADODB.property")
Record 对象 (ADO version 2.5)
ADO Record 对象用于容纳记录集中的一行、或文件系统的一个文件或一个目录。ADO 2.5 之前的版本仅能够访问结构化的数据库。在一个结构化的数据库中,每个表在每一行均有确切相同的列数,并且每一列都由相同的数据类型组成。Record 对象允许访问行与行之间的列数且/或数据类型不同的数据集。语法:
objectname.property
objectname.method
Recordset 对象
ADO Recordset 对象用于容纳一个来自数据库表的记录集。一个 Recordset 对象由记录和列(字段)组成。在 ADO 中,此对象是最重要且最常用于对数据库的数据进行操作的对象。
ProgID set bjRecordset=Server.CreateObject("ADODB.recordset")
当您首次打开一个 Recordset 时,当前记录指针将指向第一个记录,同时 BOF 和 EOF 属性为 False。如果没有记录,BOF 和 EOF 属性为 True。Recordset 对象能够支持两种更新类型:立即更新 - 一旦调用 Update 方法,所有更改被立即写入数据库。 批更新 - provider 将缓存多个更改,然后使用 UpdateBatch 方法把这些更改传送到数据库。
在 ADO,定义了 4 中不同的游标(指针)类型:
-
动态游标 - 允许您查看其他用户所作的添加、更改和删除
-
键集游标 - 类似动态游标,不同的是您无法查看有其他用户所做的添加,并且它会防止您访问其他用户已删除的记录。其他用户所做的数据更改仍然是可见的。
-
静态游标 - 提供记录集的静态副本,可用来查找数据或生成报告。此外,由其他用户所做的添加、更改和删除将是不可见的。当您打开一个客户端 Recordset 对象时,这是唯一被允许的游标类型。
-
仅向前游标 - 只允许在 Recordset 中向前滚动。此外,由其他用户所做的添加、更改和删除将是不可见的。
可通过 CursorType 属性或 Open 方法中的 CursorType 参数来设置游标的类型。
注释:并非所有的提供者(providers)支持 Recordset 对象的所有方法和属性。
Stream 对象 (ADO version 2.5)
ADO Stream 对象用于读写以及处理二进制数据或文本流。
Stream 对象可通过三种方法获得:
-
通过指向包含二进制或文本数据的对象(通常是文件)的 URL。此对象可以是简单的文档、表示结构化文档的 Record 对象或文件夹。
-
通过将 Stream 对象实例化。这些 Stream 对象可用来存储用于应用程序的数据。跟与 URL 相关联的 Stream 或 Record 的默认 Stream 不同,实例化的 Stream 在默认情况下与基本源没有关联。
-
通过打开与 Record 对象相关联的默认 Stream 对象。打开 Record 时便可获取与 Record 对象相关联的默认流。只需打开该流便可删除一个往返过程。
语法
objectname.property
objectname.method
ADO.NET使用Connection对象来连接数据库,使用Command或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader或DataAdapter,然后再使用取得的DataReader或DataAdapter对象操作数据结果。
Connection对象
建立Connection对象的代码:
OleDbConnection MyConnection=new OleDbConnection();//OLEDB SqlConnection MyConnection=new SqlConnection();//SQL
ConnectionString属性:获取或设置连接语句。
MyConnection.ConnectionString="server=(local); database=pubs;uid=sa;pwd=''";
DataBase属性:获取当前打开数据库
DataSource属性:获取打开数据库的连接实例
Open方法:打开连接
Close方法:关闭连接
Command与DataReader对象
Command对象中包含了提交数据库系统的访问信息。OleDbCommand与SqlCommand对象,它们的基本对象和操作方法是相同的,在此介绍OleDbCommand的用法,SqlCommand的用法类推即可.如:
OleDbCommand myComm = new OleDbCommand(strQuery,myConnection);
第一个参数是sql语句或存储过程名,第二个参数是前面的Connection对象的实例
Command对象的主要的属性和方法有:
Connection属性:设置或获取Command对象使用的Connection对象实例
CommandText属性:设置或获取需要执行的sql语句或存储过程名
CommandType属性:设置或获取执行语句的类型。它有3个属性值:StoredProceduce(存储过程)TableDirect Text(标准的SQL语句)默认是Text
Parameters属性:取得参数值集合
ExecuteReader方法:执行CommandText指定的SQL语句或存储过程名,返回值类型为DataReader
ExecuteNonQuery方法:与ExecuteReader功能相同,只是返回值为执行sql语句或存储过程受影响的记录行数
DataReader的主要属性和方法有:
FieldCount属性:显示当前数据记录的字段总和
IsClosed属性:判断DataReader对象是否已经关闭
Close方法:关闭DataReader对象
GetString方法:以String类型返回指定列中的值
Getvalue方法:以自身的类型返回指定列中的值
Getvalues方法:返回当前记录所有字段的集合
Read方法:将"光标"指向DataReader对象的下一记录
DataSet与DataAdapter
DataReader对象只能实现对数据的读取,不能完成其他的操作。ADO.NET提供一款更强大的数据操作对象――DataSet可以将DataSet看成一个非连接的数据库,因为DataSet的内部存储结构与数据库很类似,拥有数据表(DataTable)数据表关联(DataRelation)。
DataSet中可以存储多张表等。DataSet拥有类似于数据库的结构,但它并不等同于数据库。首先他可以存储来自数据库的数据,而且还可以存储其他格式的数据,比如XML格式文档;
A.查询数据
讲到DataSet的数据库应用,先要了解ADO.NET中的另一个对象DataAdapter.
它也分为SqlDataAdapter和OleDbDataAdapter
OleDbDataAdapter MyAdapter= new OleDbDataAdapter(); SqlDataAdapter MyAdapter=new SqlDataAdapter();
取得的DataAdapter对象时必须赋予一个连接对象:
MyAdapter.SelectCommand.Connection = MyConn; MyAdapter.UpdateCommand.Connection = Myconn; MyAdapter.DeleteCommand.Connection = MyConn; MyAdapter.InsertCommand.Connection = Myconn;
如果需要执行SQL语句,那么还必须给相应的CommandText属性赋值。代码为:
MyAdapter.*Command.CommandText = SQL语句;
写这么多行代码似乎有些麻烦,如果你只是查询数据库,则可以在建立DataAdapter实例时就完成上述工作。
OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSelect,objConnection);
DataAdapter和DataSet有联系的是DataAdapter对象的Fill方法。他有很多中用法:
MyDataAdapter.Fill(DataSet);
MyDataAdapter.Fill(DataSet,TableName);
MyDataAdapter.Fill(DataSet,StartRow,RowsCount,TableName);
DataSet绑定至DataGrid控件显示:
dg1.DataSource = ds.Tables["Score"].DefaultView; dg1.DataBind(); dg1.DataSource = ds; dg1.DataMember="Score"; dg1.DataBind();
提示:DataSet中的各种集合,访问子项有两种方法,一种是用子项的名,一种是用数字索引.比如要访问表"Score",可以用:DataSet.Tables[0]访问(多张表依次类推)
B.插入数据
DataSet的结构和数据库相似,所有插入数据实质上就是在DataSet的数据表里插入一行(DataRow)
DataRow dr= ds.Tables["Score"].NewRow();//新建一行 dr.["Name"] = "addme"; dr.["class"] ="201"; ds.Tables["Score"].Rows.Add(dr);//将新建的行加到DataTable的DataRow集合中
这样对DataSet的操作仅仅是在DataSet中执行,并不影响数据库中的数据,要使用DataAdapter的Update方法(有多种方法).
DataAdapter.Update(DataSet);
DataAdapter.Update(DataSet,TableName);
C.更新数据
实际就是在DataSet数据行上面直接修改数据
DataRow dr = ds.Tables["Score"].Rows[0];//取出第一行 dr.["Name"] = "比尔";//修改 dr.["class"] = "201";
如果要更新数据库,则再调用Update方法
D.删除数据
找到相应的数据行,然后删除
DataRow dr =ds.Tables["Score"].Row[0]; dr.Delete();
注意:DataAdapter对象在数据发生改变时,并不能自动产生数据库系统所需的交易sql语句,所有要建立一个CommandBuilder对象,它能自动产生交易的sql语句.
OleDbCommandBuilder custcb = new OleDbCommandBuilder(MyAdapter);
E.DataSet的其他特征
DataSet、DataTable和DataRow都有一个十分有用的方法----RejectChanges,
它时操作对象拒绝已经发生的改变,将数据复原.该方法于AcceptChanges HasErrors等属性连用非常有用.
==================================================================
- Connection对象主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。这个类在ADO.NET 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。
- Command对象主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection对象上,也就是Command对象是透过连结到数据源
- DataAdapter/DataSetCommand 对象主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command对象下达命令后,并将取得的数据放入DataSet对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet使用的功能。在Beta2版中DataSetCommand会更名为DataAdapter。
- DataSet 这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet的能力不只是可以储存多个Table而已,还可以透过DataSetCommand对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataSetCommand 对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataSetCommand 对象当做DataSet 对象以及数据源间传输数据的桥梁。
- DataReader当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。