ODAC使用

来源:互联网 发布:axure rp mac 编辑:程序博客网 时间:2024/06/05 06:19

ODAC使用1 —— 写在前面

本来《ODAC使用2》是我写的第一篇有关ODAC使用的文章,但写着写着发现还有一些东西(除了ODAC控件安装)要写在前面。


TOraSession组件:

Session(会话)程序与数据库沟通的基础,就是说,要想操作数据库中的数据(查询、插入或是更新),首先要做的就是要开通程序与数据库服务之间的会话。

我是Java出身的,不知道是不是可以这样理解,Session就像是Java中的Connection(数据库连接)。

在以后的部分中会常常用到TOraSession组件,谁叫Ta是基础呢。


。。。 。。。

以后可能还会有需要写在前面的东西,随时可能添加。。。

 

ODAC使用2 —— TOraDataSource组件

          由于工作需要,现在要学习在C++ Builder中使用ODAC(Oracle Data Access Components)的数据库操作,因为我一直以来都是做Java方面工作的,所以对C++,尤其是C++ Builder不是太熟悉。

         但是,Google了一下,现在网上有关ODAC使用的内容非常少(不知道是什么原因,在网络上C++的资源要比Java资源少得多,有知道资源朋友推荐一下,谢谢)。

         后来,对照了部分ODAC组件和C++ Builder自带数据库组件的方法,发现一个神奇的问题,ODAC组件和C++ Builder自带数据库组件的方法大部分是类似的,于是我找来一本《C++ Builder 6程序设计教程》(陆为中 刘文亮 等 编著,第7章7.3数据访问组件)。

         ODAC使用的文章主要以《C++ Builder 6程序设计教程》为参考,甚至摘录部分内容。

整理一下,加强记忆,方便以后查阅。

名词:
         数据集组件:通过设置其属性能够连接数据库,如:TOraQuery、TOraTable、TOraStoredProc组件;
         数据控制组件:略

TOraDataSource组件:
         TOraDataSource组件联系数据集组件和数据控制组件;

1.属性说明

         AutoEdit属性
         AutoEdit属性用于控制用户是否能对与之连接的数据集中的数据进行修改。

         DataSet属性
         上面说过的“TOraDataSource组件联系数据集组件和数据控制组件”,这个DataSet属性就是指定数据源组件引用哪个数据集组件的。
该属性可以在程序设计时指定,也可以在程序运行时赋值。

         Enabled属性
         Enabled属性控制与TOraDataSource组件相连的数据控制组件是否显示数据。Enabled属性值为true时,数据控制组件显示数据;Enabled属性值为false时,数据控制组件则不显示任何数据。
         Enabled属性默认值为true。

         State属性
         State属性返回与TOraDataSource组件相连的数据集组件的当前状态。
                  当Enabled属性为false或者没有指定DataSet属性时,无论数据集组件的实际状态如何,State属性总是为dsInactive。否则,State属性值与数据集的当前状态相符。

2.方法说明
         Edit方法,该方法允许用户对与该数据源组件相关联的数据库表进行编辑修改。Edit方法首先检查AutoEdit的属性值是否为true,State属性是否处于dsBrowse状态。然后,再调用数据集Edit方法。检查这些状态的目的是保证数据集组件处于支持编辑的状态。

3.事件说明
         OnDataChange:暂不做描述
         OnStateChange:暂不做描述
         OnUpdateData:暂不做描述

例子:

         新建一个Application项目,在Form1中一个TLabel、三个按钮,再添加TOraSession、TOraQuery、TOraDataSource三个对象;

         双击TOraSession对象,在填出窗口中分别填入Username、Password、Server、Home,然后关闭窗口;设置三个按钮分别为连接、断开和关闭;

         双击连接按钮,写入以下内容:
-------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::connectClick(TObject *Sender)
{
         OraSession1->Connect();
         OraQuery1->Session = OraSession1;
         OraQuery1->SQL->Clear();
         OraQuery1->SQL->Add("select a,b,c from test");
         OraQuery1->Open();
         OraDataSource1->DataSet = OraQuery1;
}
-------------------------------------------------------------------------------------------------------------
         双击断开按钮,写入以下内容:
-------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::disconnectClick(TObject *Sender)
{
         OraSession1->Disconnect();
}
-------------------------------------------------------------------------------------------------------------
         双击关闭按钮,写入以下内容:
-------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
         Form1->Close();       
}
-------------------------------------------------------------------------------------------------------------
         选择TOraDataSource对象,在左边的Object Inspector窗口选择Events卡片,双击OnStateChange,写入以下内容:
-------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::OraDataSource1StateChange(TObject *Sender)
{
       Label1->Caption = OraDataSource1->State;
}
-------------------------------------------------------------------------------------------------------------
         点击“F9”运行。
 

ODAC使用3 —— TOraTable组件(1/2)

           在ODAC的组件中,TOraTable、TOraQuery和ToraStoreProc三个组件用于来联系应用程序和数据库表,Ta们同属于数据集(DataSet)组件,都是继承数据集而来;因此,有着许多共同的属性、方法和事件。
          C++ Builder中应用程序通过数据集组件(基本单元)来访问数据库。
          应用程序中的数据控制组件通过数据集组件与数据库表连接,并操作(插入、删除或是修改)其中的数据。TOraTable组件只用于处理单一表,多表处理要使用TOraQuery组件。


1.TOraTable组件与数据库表连接


          Session属性
          TOraSession负责打开与数据库的会话,Session属性就是要告诉TOraTable组件对象通过哪个Session来访问数据库,或是说选择不同的Session就是选择不同的数据库。


          TableName属性
          TableName属性用来指定组件所连接的表。Ta可以在设计阶段给定,也可以在运行时通过复制语句修改此属性。

          注意:设定TableName属性时,Active属性一定要设为false(Active?)


          ReadOnly属性
          该属性设置用true时,说明不能对TOraTable组件连接的表进行修改;当为false(默认值)则可以修改。


2.数据库表的打开、关闭与清空

          Active属性
          通过Active属性可以打开和关闭数据库表,Active属性设为true时打开数据库表,设为false时将关闭数据库表。

          Open方法
          调用Open方法打开数据库表,将Active属性值为true。

          Close方法
          调用Close方法关闭数据库表,同时将Active属性值为false。

          注意:当属性值Sessioin和TableName发生变化时,Active属性会自动变为false。


          EmptyTable方法
          调用后清空数据库表中的全部记录,该方法只能在数据库表关闭的情况下进行。

          针对蓝色部分的描述,我试验了一下:
                    OraTable1->TableName = "test2"; 
                    OraTable1->Open();
                    //OraTable1->Close();
                    OraTable1->EmptyTable();
          执行结果,表test2还是被清空了,可能这只适用于TTable组件,不适用于TOraTable组件;同样,我也在Close的情况下EmptyTable,表也被清空了。


3.记录指针的移动

          First方法
          将记录指针移到表的第一条记录。

          Prior方法
          将记录指针移到当前指向记录的上一条记录。

          Next方法
          将记录指针移到当前指向记录的下一条记录。

          Last方法
          将记录指针移到表的最后一条记录。

          MoveBy(n)方法
          将记录指针从当前位置移动n条记录;n>0表示向后移动,n<0表示向前移动。

          Bof和Eof属性
          这两个属性的值均为布尔值。Bof当前记录指针在表的第一个记录时,值为true;Eof当前记录指针在表的最后一个记录时,值为true。
          如果Bof和Eof都为true时,则表示表为空。

4.记录的添加、插入、删除和编辑

          Append方法
          该方法在数据库表的末尾加一条空记录,并将数据集置为插入状态,新的记录置为当前记录。

          AppendRecord方法
          该方法将给定的数据记录添加到数据库表的末尾,并将数据集置为插入状态,新的记录置为当前记录。
          如:OraTable->AppendRecord(ARRAYOFCONST(("1", "2", "3")));
          其中,ARRAYOFCONST是一个宏,将给定的数据转换为AppendRecord方法需要的TVarRec类型。将缺少的字段值填写为NULL。

          Insert方法
          该方法在表的当前记录之前插入一条空白记录,并将数据集置为插入状态。

          InsertRecord方法
          该方法与AppendRecord类似,在表的当前记录之前插入一条给定数据的记录,并将数据集置为插入状态。

       Eidt方法
          调用Edit方法使数据表处于编辑状态。如果数据集为空,则Edit方法调用Insert方法。

          Post方法
          该方法将当前编辑、修改的数据写入物理数据库表。

          Cancel方法
          取消对表中记录的修改(还未Post的),并将数据集置为dsBrowse状态。

          Delete方法
          删除表中的指针指向记录。

          Refresh方法
          刷新当前数据表,通常用于对SQL数据库表的处理(这是书上的原话,难道还有不是SQL的数据库?此话,对ODAC好像不适用)

          看到这里,我才发现原来ODAC和什么BDE有好些是不一样的,《C++ Builder程序设计教程》中有两节“记录的定位与查找”和“设定数据库查找范围的方法”,其中讲解的多数的TTable方法或属性在TOraTable中都是没有的。

5.过滤记录

          Filter属性
          这个属性有点像select语句中where部分,Filter属性不仅可以直接设置条件,如A=‘1’;也可以在程序运行时设置,如:
          OraTable->Filter = "A='" + Edit1->Text + "'";
          OraTable->Filtered = true;

          Filtered属性
          当该属性值为true时,过滤器有效,满足条件的显示,否则全部显示。

6.数据表中的字段数、记录数与控制连接

          FieldCount属性:字段个数
          KeyFieldCount属性:主键个数
          RecordCount属性:记录数
          DisableControls方法:禁止在数据控制组件上显示对表的处理过程,此方法可以加快表的处理速度。
          EnableControls方法:运行在数据控制组件上显示对表的处理过程。

          还有个第7部分,挺有意思的在Java里没有的,挺神奇的,《实现多表关联》,有一个小例子,所以单独再列一篇。
 

ODAC使用4 —— TOraTable组件(2/2)

实现多表关联

         这部分挺是神奇的,TOraTable可以设置Ta的上一级及与上级的对应字段,在设置好这些后,table中的数据会根据上级table中选中的记录显示不同的符合对应条件的记录。
         在TOraTable是通过两个关键属性来实现Ta神奇的地方的。

         MasterSource属性
         在主从表关系中,给从表指明方向,设置主表的DataSource组件名称。

         MasterFields属性
         上面,主从表已经确定,下面需要指明字段的对应关系了。

         例子:
         首先,在库中新建两个表,随便放上些数,提供后面使用。
-------------------------------------------------------------------------------------------------------------
create table example_master (
        m1 VARCHAR2(10),
        m2 VARCHAR2(10),
        m3 VARCHAR2(10)
);
alter table example_master
  add constraint key_example_master primary key (m1);

create table example_detail (
        d1 VARCHAR2(10),
        d2 VARCHAR2(10),
        md VARCHAR2(10)
);
alter table example_detail
  add constraint key_example_detail primary key (d1);

insert into example_master (m1,m2,m3) values ('1', '4', '3');
insert into example_master (m1,m2,m3) values ('2', '3', '3');
insert into example_master (m1,m2,m3) values ('3', '2', '3');
insert into example_master (m1,m2,m3) values ('4', '1', '3');

insert into example_detail (d1,d2,md) values ('1', '0', '1');
insert into example_detail (d1,d2,md) values ('2', '9', '1');
insert into example_detail (d1,d2,md) values ('3', '8', '3');
insert into example_detail (d1,d2,md) values ('4', '7', '3');
insert into example_detail (d1,d2,md) values ('5', '6', '2');
insert into example_detail (d1,d2,md) values ('6', '5', '2');
insert into example_detail (d1,d2,md) values ('7', '4', '2');
insert into example_detail (d1,d2,md) values ('8', '3', '4');
insert into example_detail (d1,d2,md) values ('9', '2', '4');
insert into example_detail (d1,d2,md) values ('0', '1', '4');
-------------------------------------------------------------------------------------------------------------
         在C++ Builder中新建一个Application,
         添加一个TOraSession,命名为“session1”,并填好连接数据库的相关信息;
         添加一个TOraTable,命名为“mTable”,双击组件,Table Name:EXAMPLE_MASTER,Key Fields:M1;
         添加一个TOraDataSource,命名为“mSource”,并DataSet选择为“mTable”;
         添加一个TOraTable,命名为“dTable”,这次这个是从表的了,双击组件,Table Name:EXAMPLE_DETAIL,Key Fields:D1;还有关键的两步,MasterSource属性设置为“mSource”,也就是主表的TOraDataSource ,再点击MasterFields后面的“...”按钮,弹出对话框,选择MD和M1,点击“Add”,OK;
        
        
         添加一个TOraDataSource,命名为“dSource”,并DataSet选择为“mTable”;
         添加一个DBGrid,命名为“mGrid”,DataSource选择为“mSource”;
         添加一个DBGrid,命名为“dGrid”,DataSource选择为“dSource”;
         添加一个TButton,命名为“Connect”,双击按钮主键写上事件处理:
-------------------------------------------------------------------------------------------------------------
         session1->Connect();
         mTable->Open();
         dTable->Open();
-------------------------------------------------------------------------------------------------------------
         添加一个TButton,命名为“Disconnect”,双击按钮主键写上事件处理:
-------------------------------------------------------------------------------------------------------------
         mTable->Close();
         dTable->Close();
         session1->Disconnect();
-------------------------------------------------------------------------------------------------------------
         到此OK,要做的都做了,可以F9执行一下看看效果。        
         点击“Connect”按钮,数据就出来了,而且下面的数还跟着上面跑,借用同事的话——“这就是Ta神奇的地方”。
        
 

ODAC使用5 —— TOraQuery组件(终)

              本来我以为TOraQuery组件是比较复杂的,在整理了TOraTable组件后,发现TOraQuery并没有想象中的那么麻烦。
             感觉上TOraQuery与TOraTable唯一的不同就是,table要指定表名和主键,而query有的就是一个SQL语句。
            
             TOraQuery组件中SQL语句的编写和执行
            
             编写SQL语句

             在此默认大家都会用SQL,有两种方法可以给TOraQuery组件设置SQL,
             1)双击TOraQuery组件,在填出的对话框中写SQL语句;
             2)通过SQL属性,例如:
                     OraQuery1->Close();
                     OraQuery1->SQL->Clear();
                     OraQuery1->SQL->Add("select * from test2");
                     OraQuery1->Open();
            
             执行SQL语句

             执行又有两种可能,
             1)执行返回数据集的SQL语句(如:select),当SQL属性被修改后,应当调用Open方法。
             2)对不返回数据集的语句(如:insert、update、delete)使用ExecSQL方法。
            
             动态SQL语句参数
            
             很简单,就是在写SQL语句时,把可能会变动的地方,用“:<动态参数名>”代替;
             如何给动态参数赋值呢?
             有两种方法,
             1)ParamByName方法,根据参数名给参数赋值,如:
             Query->ParamByName("hehe")->AsString="ha-ha";
             2)Params属性,根据参数在SQL语句中的顺序赋值,如:
             Query->Params->Items[0]->AsString="ha-ha";
             通过ParamCount属性可以获得参数的数目。
            
             在TOraQuery组件中编辑数据表
            
             要通过TOraQuery组件修改数据也没什么难的,就是我符合两个条件,
             1)SQL语句是对单表的查询,且查询中不能有聚集运算(如AVG、SUM)
             2)组件的ReadOnly属性设置为false。
            
             《C++ Builder程序设计教程》中还提到了主从表的操作,看了一下,和TOraTable组件的差别不大,不写了。
            
             到此,《C++ Builder程序设计教程》中有关数据库控件就结束了(后面,还有一个综合的例子),有时间在整理一下。

        
0 0
原创粉丝点击