Midas进阶 - 巢状数据表实现Master/Detail的应用系统
首先,还应该知道Master/Detail到底是什么关系;
其次,要明白什么是巢状数据表是什么意思;
Master/Detail这种主细关系,只要做过数据库程序的人应该都知道,在C/S结构里随时都是,很长见的;
巢状数据表应该如何理解?它就是分布式系统和C/S结构的对于Master/Detail的不同操作机制而引申的;从客户端而言,在C/S结构中,Master/Detail可以用两个数据集组件分别取出表中具有Master/Detail关系的数据,但是在分布多中,对于客户端而言,我们只关心Master的数据集的处理方式,而如何对应Master/Detail则是在应用服务方面进行操作,当我们正确连接了客户端的MasterClinetDataSet(TClientDataSet)时,其所对应的Detail就会随着数据包自动的下载到客户端,这就是巢状数据表的初步解释;而它的正真定义应该是:当数据封包在封装数据时,这个数据封包甚至能够把一个数据集封装起来;
下边用一个例程来说明:
应用服务端:在应用服务器上要实现两个数据组件的M/D(Master/Detail,以后用M/D代替)的关系,可以用TTable or TQuery ,TADOQuery or TADOTable or TADODataSet组件都完全可以;这儿要建立它们的M/D关系,和C/S中的完全一样(中间需要通过一个TDataSource连接);
客户端:在客户端只需要用一个TClientDataSet来接收数据,这儿更能体现“巢状“,所谓的接收数据是从应用服务端下载数据,是将M/D数据都下载下来,这后,Delphi可以自动的识别这是一个M/D结构的;此时需要将另一个TClientDataSet组件加进来,而且要设置它的DataSetField为下载数据的TClientDataSet中的Detail数据字段(可以这样理解);但不应该忘记了要执行TClientDataSet.Fetch Params,只有这样才可以实现Detail -> TClientDataSet的DataSetField的设置;
设置完成后,就可以正确运行了;
下边我给出设置实例,供参考
应用服务端窗体文件如下:
object DMF_LX: TDMF_LX
OldCreateOrder = False
Left = 192
Top = 107
Height = 409
Width = 570
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initia' +
'l Catalog=pubs;Data Source=(local)'
/数据连接字符串,有必要看一看;
LoginPrompt = False
Provider = 'SQLOLEDB.1'
Left = 72
Top = 32
end
object MADODataSet: TADODataSet
Connection = ADOConnection1
CursorType = ctStatic
CommandText = 'select * from publishers'
Parameters = <>
Left = 64
Top = 104
object MADODataSetpub_name: TStringField
FieldName = 'pub_name'
Size = 40
end
object MADODataSetcity: TStringField
FieldName = 'city'
end
object MADODataSetstate: TStringField
FieldName = 'state'
FixedChar = True
Size = 2
end
object MADODataSetcountry: TStringField
FieldName = 'country'
Size = 30
end
end
object DADODataSet: TADODataSet
Connection = ADOConnection1
CursorType = ctStatic
CommandText = 'select * from titles'
DataSource = MDDataSource
IndexFieldNames = 'pub_id'/这儿建立关系;
MasterFields = 'pub_id' /这儿建立关系;
Parameters = <>
Left = 168
Top = 104
end
object GADODataSet: TADODataSet
Connection = ADOConnection1
Parameters = <>
Left = 272
Top = 104
end
object MDDataSource: TDataSource
DataSet = MADODataSet
Left = 264
Top = 32
end
object MDataSetProvider: TDataSetProvider
DataSet = MADODataSet
Constraints = True
Left = 64
Top = 168
end
object DDataSetProvider: TDataSetProvider
DataSet = DADODataSet
Constraints = True
Left = 176
Top = 168
首先,还应该知道Master/Detail到底是什么关系;
其次,要明白什么是巢状数据表是什么意思;
Master/Detail这种主细关系,只要做过数据库程序的人应该都知道,在C/S结构里随时都是,很长见的;
巢状数据表应该如何理解?它就是分布式系统和C/S结构的对于Master/Detail的不同操作机制而引申的;从客户端而言,在C/S结构中,Master/Detail可以用两个数据集组件分别取出表中具有Master/Detail关系的数据,但是在分布多中,对于客户端而言,我们只关心Master的数据集的处理方式,而如何对应Master/Detail则是在应用服务方面进行操作,当我们正确连接了客户端的MasterClinetDataSet(TClientDataSet)时,其所对应的Detail就会随着数据包自动的下载到客户端,这就是巢状数据表的初步解释;而它的正真定义应该是:当数据封包在封装数据时,这个数据封包甚至能够把一个数据集封装起来;
下边用一个例程来说明:
应用服务端:在应用服务器上要实现两个数据组件的M/D(Master/Detail,以后用M/D代替)的关系,可以用TTable or TQuery ,TADOQuery or TADOTable or TADODataSet组件都完全可以;这儿要建立它们的M/D关系,和C/S中的完全一样(中间需要通过一个TDataSource连接);
客户端:在客户端只需要用一个TClientDataSet来接收数据,这儿更能体现“巢状“,所谓的接收数据是从应用服务端下载数据,是将M/D数据都下载下来,这后,Delphi可以自动的识别这是一个M/D结构的;此时需要将另一个TClientDataSet组件加进来,而且要设置它的DataSetField为下载数据的TClientDataSet中的Detail数据字段(可以这样理解);但不应该忘记了要执行TClientDataSet.Fetch Params,只有这样才可以实现Detail -> TClientDataSet的DataSetField的设置;
设置完成后,就可以正确运行了;
下边我给出设置实例,供参考
应用服务端窗体文件如下:
object DMF_LX: TDMF_LX
OldCreateOrder = False
Left = 192
Top = 107
Height = 409
Width = 570
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initia' +
'l Catalog=pubs;Data Source=(local)'
/数据连接字符串,有必要看一看;
LoginPrompt = False
Provider = 'SQLOLEDB.1'
Left = 72
Top = 32
end
object MADODataSet: TADODataSet
Connection = ADOConnection1
CursorType = ctStatic
CommandText = 'select * from publishers'
Parameters = <>
Left = 64
Top = 104
object MADODataSetpub_name: TStringField
FieldName = 'pub_name'
Size = 40
end
object MADODataSetcity: TStringField
FieldName = 'city'
end
object MADODataSetstate: TStringField
FieldName = 'state'
FixedChar = True
Size = 2
end
object MADODataSetcountry: TStringField
FieldName = 'country'
Size = 30
end
end
object DADODataSet: TADODataSet
Connection = ADOConnection1
CursorType = ctStatic
CommandText = 'select * from titles'
DataSource = MDDataSource
IndexFieldNames = 'pub_id'/这儿建立关系;
MasterFields = 'pub_id' /这儿建立关系;
Parameters = <>
Left = 168
Top = 104
end
object GADODataSet: TADODataSet
Connection = ADOConnection1
Parameters = <>
Left = 272
Top = 104
end
object MDDataSource: TDataSource
DataSet = MADODataSet
Left = 264
Top = 32
end
object MDataSetProvider: TDataSetProvider
DataSet = MADODataSet
Constraints = True
Left = 64
Top = 168
end
object DDataSetProvider: TDataSetProvider
DataSet = DADODataSet
Constraints = True
Left = 176
Top = 168