ADO SQL学习

来源:互联网 发布:淘宝为什么下载不了 编辑:程序博客网 时间:2024/05/01 02:44

ADO

http://blog.csdn.net/b2b160/article/details/5650212

前面已经了解了在Visual C++下进行数据库编程,可供选择的访问技术有许多,我们需要根据情况选择适当的技术。在此我们就来具体了解这些技术的概貌。

 

 

ADO对象模型组成

 

ADO是一组由微软提供的COM组件,基于面向对象思想的编程接口。它建立在COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼,由三个主要对象Connection、Command、Recordset和几个辅助对象组成。对象间的关系如图1所示:

图1

 

 

几个关键对象的作用如下所示:

Connection对象:

创建与数据库互动所需的连接,Connection对象提供OLE DB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。任何数据库的操作行为都必需在连接基础底下进行。因此在使用ADO之前,首先便需创建一个Connection对象。必需注意的是,这个动作不是绝对的,ADO本身会在没有Connection对象的情形之下,自行创建所需的连接对象。

通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。

 

Command对象:

Command对象封装了数据源可以解释的命令,它针对连接的数据库进行数据变动,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。将用户提供的指令,传送到数据库,进行新增、删除或是修改资料等变动处理。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

 

Recordset对象:

Recordset用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。它向连接的数据库,提出取得符合特定条件的数据内容。应用程序从Recoreset对象的身上取得所要查看处理的特定数据内容,这数据可能是某个特定数据表的全部或是特定内容,或是跨越多个数据所取得关系型数据,以二维数组的表格形式作展现。

它对记录集提供了更多的控制功能,如记录锁定,游标控制等。

 

以下这些对象是为完成数据库访问,而设置的辅助对象,他们配合上面几个关键对象来完成具体的访问工作。

Record对象:

Record对象表示记录集Recordset或者是数据提供者上的一条记录,它提供了对单条记录的数据字段的操作,通过它对数据字段进行读取、修改。

 

Stream对象:

Stream流对象主要用来处理记录集中的二进制数据流的,如文件内容或者图片对象等。

 

Fields集合和Field对象

Fields集合处理记录中的各个列。记录集中返回的每一列在Fields集合中都有一个相关的Field对象。Field对象使得用户可以访问列名、列数据类型以及当前记录中列的实际值等信息。

 

Parameters集合Parameter对象

Command对象包含一个Parameters集合。Parameters集合包含参数化的Command对象的所有参数,每个参数信息由Parameter对象表示。

 

Properties集合和Property对象

Connection、Command、Recordset和Field对象都含有Proiperties集合。Properties集合用于保存与这些对象有关的各个Property对象。Property对象表示各个选项设置或其他没有被对象的固有属性处理的ADO对象特征。

 

Errors集合和Error对象

Connection对象包含一个Errors集合。Errors集合包含的Error对象给出了关于数据提供者出错时的扩展信息。

 

以上为ADO对象模型的各对象间的概要描述,对于各个对象的具体使用方法和使用场合,我们将在以后章节中展开讲解、并将会给出实际的使用例子。

 

 

代码例子展示:       

数据库主要是用来做数据的存储,并进行数据添加、访问、修改操作的。我们就看看如何通过ADO的关键对象来完成这些功能。

我们假设要做一个学生信息管理的软件,那么就需要存储每个学生的资料,我们可以使用Access建立一个学生信息的数据库”classdat.mdb”,并建立测试的表如下:

 

 

图2

 

 

表中输入如下数据,然后我们将演示如何对此数据库进行访问操作。

 

图3

 

 

首先,要操作任何数据库,首先要连接数据库,我们通过Connection对象进行该操作。

[cpp] view plaincopy
  1. HRESULT hr;  
  2. _ConnectionPtr pConnection;   // 连接源  
  3.        _bstr_t strConn("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=/"");  
  4.        strConn += _T(“classdat.mdb”); // 此处是指向数据库文件名  
  5.        strConn += "/"";  
  6.        hr = pConnection.CreateInstance(_uuidof(Connection));  
  7.        pConnection->Open(strConn, """", NULL);  
 

      

以上代码为了便于说明,去掉了容错代码。只为了突出功能代码。

通过以上代码就能与数据库建立连接,并保存在智能指针pConnetion之中。

其他的ADO对象都要通过此对象与数据库操作。

       然后,要获取数据表的内容需要通过Recordset对象和Connetion对象协作完成。

例如,我们需要查看学生表Students里的学生信息,首先要打开表记录,可通过如下代码完成。

      

[cpp] view plaincopy
  1. _RecordsetPtr pRecordset;  
  2.        pRecordset.CreateInstance( __uuidof( Recordset ));  
  3.        pRecordset->Open(_variant_t("select * from Students"), _variant_t((IDispatch *)pConnection, true), adOpenKeyset, adLockOptimistic, adCmdText);  
 

具体参数现在不解释,只要理解Recordset用于打开记录集合并表示数据集。然后通过辅助对象获取记录集合中的记录字段内容。如下,我们通过CString对象strStudentName来接收字段StudentName的内容。

      

[cpp] view plaincopy
  1. CString strStudentName = pRecordset->Fields->GetItem( _variant_t(1L) )->Value;  
 

这样,strStudentName的值将是数据库中第一条记录的StudentName字段的内容--”李丹”。其他字段可按同样的方法得到。

     透过Recordset我们还可以修改数据,及删除数据。例如我们要将数据李丹的名字修改为李双,可以通过如下代码实现:

      

[cpp] view plaincopy
  1. pRecordset->Fields->GetItem( _variant_t(1L) )->Value = _T(“李双”);  
  2.      pRecordset->Update();  
 

     加入要删除当前数据,可直接通过

[cpp] view plaincopy
  1. pRecordset->Delete( AffectEnum::adAffectCurrent );  
 

可能同学们看到这里要问,目前只能修改删除李丹这个同学的资料,没错,如果要浏览数据就要了解Recordset的重要的浏览功能MoveNext及MovePrev。

要查看前一条记录可以

[cpp] view plaincopy
  1. pRecordset->MovePrevious();  
 

要查看后一条记录可以

[cpp] view plaincopy
  1. pRecordset->MoveNext();  
 

此外还有一个重要的对象是Command对象,它同样是用来处理数据集的。而且提供了更高级的概念,提供了更多高级的数据操作功能。将在以后章节进行展开说明。至此,同学们应该对ADO对象有了大概了解了,而且也熟悉了他们的基本用法。

 

 

ADO特点总结

Ado是Windows系统上访问数据库比较成熟的技术之一,凭借其自身的特点,自它出现后不久就迅速流行开来。ADO是应用微软COM 组件编程比较成功的项目,这也得益于COM组件的优势。而且COM是高度面向对象的思想。提供了二进制级别的组件共享机制。这使得ADO具有易于使用、访问灵活、应用广泛、数据类型丰富、高效的特点。

首先,ADO非常易于使用。

这是ADO技术的最重要的一个特征,是它能够流行起来的重要原因。由于ADO是高层应用,封装了许多底层工作,将底层的繁琐操作进行封装,并对外提供统一的接口。所以相对于OLE DB或者ODBC来说,它具有面向对象的特性。同时,在ADO的对象结构中,其对象之间的层次关系并不明显。相对于DAO等访问技术来讲,又不必关心对象的构造顺序和构造层次。对于要用的对象,不必选建立连接、会话等对象,只需直接构造即可,方便了应用程序的编制。特别是在Visual C++编程中,通过对自动化对象进行的封装,对COM组件提供了统一的编程界面,只要懂得COM编程的基础就很容易上手。同时对于脚本语言的支持,也在一定程度上降低了使用的门槛。

其次,ADO具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。

ADO技术可以访问包括关系数据库和非关系数据库的所有文件系统。它提供了访问ODBC的接口,所以可以访问ODBC能够访问的所有数据。不仅如此,它还可以访问非关系型的数据库,如文本文件。并对这些不同的数据的访问提供了统一的接口。这同样有利于降低程序编写的难度。使用ADO 将适用于ODBC兼容的数据库和 OLE DB 兼容的数据源,包括 MS SQL SERVER、Access、Oracle、Excel、文本文件等。可以看出,ADO所支持的数据库范围是非常广泛的。

还有,ADO具备高速访问数据源的能力。

由于ADO技术基于OLE DB,所以,它也继承了OLE DB访问数据库的高速性。ADO 通过一个小型的自动化接口建立一个简单而高效的到达OLE DB的中间层。所以其速度几乎与OLE DB相差无几 ,不过ADO 却能让你不需要了解OLE DB的底层繁琐的COM接口。

其次,ADO可以用于Microsoft ActiveX页

因为ADO基于COM技术,所以可以通过COM接口与其他的COM对象进行交互。它可以作为ADO控件的形式出现。所以可应用于所有支持ActiveX的语言,例如一些脚本语言也可以通过自动化接口与ADO通信,从而大大的扩大了ADO的应用范围,也使得基于ADO的程序具有更广泛的支持度。

此外,基于ADO的程序占用资源较少

由于ADO是基于组件对象模型(COM)的访问技术,它是一个二进制代码共享机制,本身就是为了节约资源而设计的。ADO组件被作为公共组件,被所有程序调用。所以,用ADO产生的应用程序占用内存少。通过上一节,我们也了解了ADO还允许同一Connection实例下有多个Record set实例。

最后,ADO允许进行批更新(使用的Update Batch方法)

ADO的批更新操作可大大减轻网络负担,提高数据库处理效率。

通过以上分析,我们看到ADO具有许多鲜明的优点。这也是它在产生出来后迅速得到广泛应用的魅力所在。尤其是通过VC对COM进行访问时,更能凸显ADO的快速高效、接口简便的特点。

 

示例程序下载

http://download.csdn.net/source/2430491


SQL(Access)

SQl 语句(常见) 新建,删除,修改表结构

新建表:
create table [表名]
(
[自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,
[字段1] nVarChar(50) default '默认值' null ,
[字段2] ntext null ,
[字段3] datetime,
[字段4] money null ,
[字段5] int default 0,
[字段6] Decimal (12,4) default 0,
[字段7] image null ,
)

删除表:
Drop table [表名]

插入数据:
INSERT INTO [表名] (字段1,字段2) VALUES (100,'51WINDOWS.NET')

删除数据:
DELETE FROM [表名] WHERE [字段名]>100

更新数据:
UPDATE [表名] SET [字段1] = 200,[字段2] = '51WINDOWS.NET' WHERE [字段三] = 'HAIWA'

新增字段:
ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL

删除字段:
ALTER TABLE [表名] DROP COLUMN [字段名]

修改字段:
ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL

重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表)
sp_rename '表名', '新表名', 'OBJECT'

新建约束:
ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] <= '2000-1-1')

删除约束:
ALTER TABLE [表名] DROP CONSTRAINT 约束名

新建默认值
ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT '51WINDOWS.NET' FOR [字段名]

删除默认值
ALTER TABLE [表名] DROP CONSTRAINT 默认值名

另外以上的只是SQL的语法在 ACCESS 下大部份也都是一样的

项一项查阅,并经自己使用验证,确认在access 数据库中添加自动编号字段使用以下方法比较合适: create table 数据表名称 (id counter constraint primarykey primary key) 需要注意的地方是:第二个primary中间有空格,另外,关键字不区分大小写. 另外自己最近发现的一种方法是: sql="create table mytb (id autoincrement(25,1) primary key,age int)" sql2="create table testtb (id autoincrement,age int,email char, primary key (id))" 其中在access中,autoincrement为自动编号类型字段,(25,1)分别为初始值及步长值,如果不写的话,默认是1,1,primary key指定了主键,以上示例,两种指定方法都可以。


0 0
原创粉丝点击