[No0000BC]ADO.NET中的几个主要对象

时间:2023-11-11 23:40:14

ADO 指 ActiveX 数据对象(ActiveX Data Objects)。

从一个 ASP 页面内部访问数据库的通常的方法是:

  1. 创建一个到数据库的 ADO 连接
  2. 打开数据库连接
  3. 创建 ADO 记录集
  4. 从记录集提取您需要的数据
  5. 关闭记录集
  6. 关闭连接

到 MS Access 数据库的 ODBC 连接:

  1. 打开控制面板中的 ODBC 图标
  2. 选择系统 ODBC 选项卡
  3. 点击 ODBC 选项卡中的添加按钮
  4. 选择 Driver to Microsoft Access,然后点击完成按钮
  5. 在下一个窗口中点击"选择"按钮来定位数据库
  6. 为此数据库赋予一个数据源名称(Data Source Name,DSN)
  7. 点击"确定"

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对象来连接数据库,使用CommandDataAdapter对象来执行SQL语句,并将执行的结果返回给DataReaderDataAdapter,然后再使用取得的DataReaderDataAdapter对象操作数据结果。

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"] ="";
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[];//取出第一行
dr.["Name"] = "比尔";//修改
dr.["class"] = "";

如果要更新数据库,则再调用Update方法

D.删除数据

找到相应的数据行,然后删除

DataRow dr =ds.Tables["Score"].Row[]; 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 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。