做了一个DEMO,主表采用即时更新,从表采用缓存更新,代码如下:
单元代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource1: TDataSource;
DataSource2: TDataSource;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
ADOTable2: TADOTable;
Button1: TButton;
procedure ADOTable1BeforePost(DataSet: TDataSet);
procedure ADOTable1AfterPost(DataSet: TDataSet);
procedure ADOTable1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure ADOTable2PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
begin
ADOConnection1.BeginTrans;
end;
procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
begin
ADOTable2.UpdateBatch;
ADOConnection1.CommitTrans;
end;
procedure TForm1.ADOTable1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if ADOConnection1.InTransaction then
ADOConnection1.RollbackTrans;
end;
procedure TForm1.ADOTable2PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if ADOConnection1.InTransaction then
ADOConnection1.RollbackTrans;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Not ADOTable1.Modified and Not ADOTable2.Modified then
Exit;
if ADOTable2.Modified then
ADOTable1.Edit;
ADOTable1.Post;
end;
end.
窗体代码:
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 89
Top = 24
Width = 320
Height = 120
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object DBGrid2: TDBGrid
Left = 89
Top = 184
Width = 320
Height = 120
DataSource = DataSource2
TabOrder = 1
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object Button1: TButton
Left = 430
Top = 82
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 2
OnClick = Button1Click
end
object DataSource1: TDataSource
DataSet = ADOTable1
Left = 418
Top = 25
end
object DataSource2: TDataSource
DataSet = ADOTable2
Left = 417
Top = 186
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
'Source=D:/MyLab/TEST/db1.mdb;Mode=Share Deny None;Extended Prope' +
'rties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path=""' +
';Jet OLEDB
atabase Password="";Jet OLEDB:Engine Type=4;Jet OLED' +
'B
atabase Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Je' +
't OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Passwo' +
'rd="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt D' +
'atabase=False;Jet OLEDB
on'#39't Copy Locale on Compact=False;Jet O' +
'LEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False'
LoginPrompt = False
Mode = cmShareDenyNone
Provider = 'Microsoft.Jet.OLEDB.4.0'
Left = 7
Top = 6
end
object ADOTable1: TADOTable
Active = True
CacheSize = 1000
Connection = ADOConnection1
CursorType = ctStatic
BeforePost = ADOTable1BeforePost
AfterPost = ADOTable1AfterPost
OnPostError = ADOTable1PostError
TableName = 'A'
Left = 463
Top = 26
end
object ADOTable2: TADOTable
Active = True
CacheSize = 1000
Connection = ADOConnection1
CursorType = ctStatic
LockType = ltBatchOptimistic
OnPostError = ADOTable2PostError
IndexFieldNames = 'A1'
MasterFields = 'A1'
MasterSource = DataSource1
TableName = 'B'
Left = 460
Top = 187
end
end
数据结构:
表A:字段A1 Char(10),字段A2 Char(10),字段A3 Char(10)
表B:字段B1 Char(10),字段A1 Char(10),字段B2 Char(10)