现在就让我们以一个实际的范例 来说明如何使用A D O E x p r e s s组件提供的M a s t e r / D e t a i l的功能。 1) 在D e l p h i集成开发环境中建立一个新的项目。然后在主窗体中加入 TA D O C o n n e c t i o n组件连接数据库,让它连接到范例N o r t h Wi n d数据库。再放入 TA D O Q u e r y组件。设定它的C o n n e c t i o n属性值为刚才的TA D O C o n n e c t i o n组件,设 定它的S Q L属性值为: select * from Suppliers。再设定它的A c t i v e属性值为Tr u e, 以便从S u p p l i e r s数据表中选择数据。接着在主窗体中加入T D a t a S o u r c e,设定它的 D a t a S e t属性值为刚才的TA D O Q u e r y组件,再加入T D B C t r l G r i d组件,并且在其中 加入S u p p l i e r s数据表的数据感知组件。此时主窗体看起来应该类似如图2 - 2 3所示。 2) 再于主窗体中加入另外一个TA D O Q u e r y。设定它的C o n n e c t i o n属性值为步 骤1 )的TA D O C o n n e c t i o n组件,然后设定它的S Q L属性值为:select * from Products Where SupplierID = :SupplierID。在范例N o r t h Wi n d数据库中,S u p p l i e r s数据表和 P r o d u c t s数据表有M a s t e r / D e t a i l关系,而且这两个数据表以S u p p l i e r I D这个字段作为 连接的索引字段。因此在这个新的TA D O Q u e r y组件中,它的S Q L属性值会以动态 参数: S u p p l i e r I D作为从P r o d u c t s选取数据的依据,而动态参数: S u p p l i e r I D则会由步 骤1 )中的Master TA D O Q u e r y组件提供。稍后会说明如何让这两个TA D O Q u e r y组件 连接在一起。现在接着放入T D a t a S o u r c e组件,设定它的D a t a s e t属性值为刚才加入 的TA D O Q u e r y组件。最后放入T D B N a v i g a t o r和T D B G r i d组件,并且设定它们的 D a t a S o u r c e属性值为刚才加入的T D a t a S o u r c e组件。 3) 现在这个步骤是让步骤1 )和步骤2 )形成M a s t e r / D e t a i l关系的关键步骤,我们 只需要设定步骤2 ) 中的TA D O Q u e r y组件的D a t a S o u r c e 属性值为步骤1 )中的 T D a t a S o u r c e组件。这样当步骤1 )的TA D O Q u e r y组件从S u p p l i e r s数据表选取数据时, 便会把S u p p l i e r s数据表中的S u p p l i e r I D传递给步骤2 )的TA D O Q u e r y,让它以这个 S u p p l i e r I D关键值做为从P r o d u c t s数据表选取数据的过滤标准。现在我们可以把步 骤2 )的TA D O Q u e r y组件的A c t i v e属性值设定Tr u e以便开始处理D e t a i l的数据表。 请编译这个范例应用程序并且执行它,那么你应该可以看到类似图2 - 2 5所示 的画面。当我们使用窗体上方的N a v i g a t o r浏览M a s t e r数据时,下方的D B G r i d就会 显示D e t a i l数据表相关的数据。现在这个范例应用程序已经是一个可以使用A D O技 术处理M a s t e r / D e t a i l关系的数据库应用程序。 现在让我们在这个范例M a s t e r / D e t a i l应用程序中对数据进行修改,看看这个范 例是否能够正确地处理修改的数据。 在上面的内容中我们讨论了如何使用A D O E x p r e s s开发M a s t e r / D e t a i l关系的应 用程序。虽然通过A D O E x p r e s s组件可以快速地开发M a s t e r / D e t a i l关系的应用程序, 也可以在应用程序中修改M a s t e r、D e t a i l或是同时修改M a s t e r / D e t a i l的数据再更新 回数据库之中。但是当应用程序同时更新M a s t e r / D e t a i l数据时,这个动作却可能非 常危险,因为A D O会使用不同的S Q L命令来更新数据。这可能会造成只更新了 M a s t e r数据而没有更新D e t a i l数据的情形。但是,如果在M a s t e r数据表被更新之后,数据库或系统发生了问题, 那么便会造成D e t a i l的数据无法更新回数据库中。对于这样的情形我们应该如何确 保数据的正确性呢?这就需要使用A D O提供的事务管理功能。
来说明如何使用A D O E x p r e s s组件提供的M a s t e r / D e t a i l的功能。
1) 在D e l p h i集成开发环境中建立一个新的项目。然后在主窗体中加入
TA D O C o n n e c t i o n组件连接数据库,让它连接到范例N o r t h Wi n d数据库。再放入
TA D O Q u e r y组件。设定它的C o n n e c t i o n属性值为刚才的TA D O C o n n e c t i o n组件,设
定它的S Q L属性值为: select * from Suppliers。再设定它的A c t i v e属性值为Tr u e,
以便从S u p p l i e r s数据表中选择数据。接着在主窗体中加入T D a t a S o u r c e,设定它的
D a t a S e t属性值为刚才的TA D O Q u e r y组件,再加入T D B C t r l G r i d组件,并且在其中
加入S u p p l i e r s数据表的数据感知组件。此时主窗体看起来应该类似如图2 - 2 3所示。
2) 再于主窗体中加入另外一个TA D O Q u e r y。设定它的C o n n e c t i o n属性值为步
骤1 )的TA D O C o n n e c t i o n组件,然后设定它的S Q L属性值为:select * from Products
Where SupplierID = :SupplierID。在范例N o r t h Wi n d数据库中,S u p p l i e r s数据表和
P r o d u c t s数据表有M a s t e r / D e t a i l关系,而且这两个数据表以S u p p l i e r I D这个字段作为
连接的索引字段。因此在这个新的TA D O Q u e r y组件中,它的S Q L属性值会以动态
参数: S u p p l i e r I D作为从P r o d u c t s选取数据的依据,而动态参数: S u p p l i e r I D则会由步
骤1 )中的Master TA D O Q u e r y组件提供。稍后会说明如何让这两个TA D O Q u e r y组件
连接在一起。现在接着放入T D a t a S o u r c e组件,设定它的D a t a s e t属性值为刚才加入
的TA D O Q u e r y组件。最后放入T D B N a v i g a t o r和T D B G r i d组件,并且设定它们的
D a t a S o u r c e属性值为刚才加入的T D a t a S o u r c e组件。
3) 现在这个步骤是让步骤1 )和步骤2 )形成M a s t e r / D e t a i l关系的关键步骤,我们
只需要设定步骤2 ) 中的TA D O Q u e r y组件的D a t a S o u r c e 属性值为步骤1 )中的
T D a t a S o u r c e组件。这样当步骤1 )的TA D O Q u e r y组件从S u p p l i e r s数据表选取数据时,
便会把S u p p l i e r s数据表中的S u p p l i e r I D传递给步骤2 )的TA D O Q u e r y,让它以这个
S u p p l i e r I D关键值做为从P r o d u c t s数据表选取数据的过滤标准。现在我们可以把步
骤2 )的TA D O Q u e r y组件的A c t i v e属性值设定Tr u e以便开始处理D e t a i l的数据表。
请编译这个范例应用程序并且执行它,那么你应该可以看到类似图2 - 2 5所示
的画面。当我们使用窗体上方的N a v i g a t o r浏览M a s t e r数据时,下方的D B G r i d就会
显示D e t a i l数据表相关的数据。现在这个范例应用程序已经是一个可以使用A D O技
术处理M a s t e r / D e t a i l关系的数据库应用程序。
现在让我们在这个范例M a s t e r / D e t a i l应用程序中对数据进行修改,看看这个范
例是否能够正确地处理修改的数据。
在上面的内容中我们讨论了如何使用A D O E x p r e s s开发M a s t e r / D e t a i l关系的应
用程序。虽然通过A D O E x p r e s s组件可以快速地开发M a s t e r / D e t a i l关系的应用程序,
也可以在应用程序中修改M a s t e r、D e t a i l或是同时修改M a s t e r / D e t a i l的数据再更新
回数据库之中。但是当应用程序同时更新M a s t e r / D e t a i l数据时,这个动作却可能非
常危险,因为A D O会使用不同的S Q L命令来更新数据。这可能会造成只更新了
M a s t e r数据而没有更新D e t a i l数据的情形。但是,如果在M a s t e r数据表被更新之后,数据库或系统发生了问题,
那么便会造成D e t a i l的数据无法更新回数据库中。对于这样的情形我们应该如何确
保数据的正确性呢?这就需要使用A D O提供的事务管理功能。