ClientDataSet在LoadFromFile后,如何提交更新到数据库?(100分)

  • 主题发起人 主题发起人 zyjsjwl
  • 开始时间 开始时间
Z

zyjsjwl

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientDataSet在LoadFromFile后,如何提交更新到数据库?
ClientDataSet在先通过SocketConnection连到数据库后,可以对数据库进行更新。但如果先LoadFromFile后,却不能提交更新到数据库了(只更新到了本地的cds文件),如何解决?
 
//将数据恢复回数据集的方法,如果只是loadfromfile由于数据集的标志未改变过,所以数据不会更新回去
var tmpClient:TClientDataSet;
TmpClient:=TClientDataSet.Create(nil);
//创建与原表相同的数据集,并读数据
TmpClient:=TClientDataSet.Create(nil);
TmpClient.FieldDefs:=tpSpecs.FieldDefs;
TmpClient.CreateDataSet;
TmpClient.LoadFromFile('文件名');
tpSpecs.Filtered:=False;
with tpSpecsdo
while RecordCount>0do
begin
first;
delete;
end;
TmpClient.First;
while not tmpclient.Eofdo
begin
tpSpecs.Append;
for i:=0 to tmpClient.FieldCount-1do
begin
if tpSpecs.State<>dsedit then
tpSpecs.Edit;
tpSpecs.Fields.Value:=TmpClient.Fields.Value;
tpSpecs.Post;
end;
TmpClient.Next;
end;
也即通过将读入的数据逐一重新追加到表,建立更新标志,然后提交才会保证数据全部保存回服务器。
 
tpSpecs呢?是LoadFromFile还是指定CommandText、ProviderName后Open?
你的思路是不是:将tpSpecs指向应用层,然后用TmpClient读取本地cds文件后逐条向tpSpecs添加记录?
我的是先tpSpecs用LoadFromFile,然后提交更新到数据库,那么就得用一个TmpClient指向应用层,将tpSpecs中的记录逐条读入后提交?
 
由于这个我在我的程序中拷贝的一段代码,所以变量的取名是根据我的程序要求设置的。
事实上以上方法有用了一年多了,没出问题。
TmpClient是一个临时的内存CDS变量,他的结构是复制tpspecs的,不需要指向任何地方。先是用先读入本地的原来用savetofile保存的CDS内存文件,然后把记录逐一的更新到tpspecs中。之于tpspecs的连接,原来系统用什么方式连接的,就用什么方式,还需要作任何更改。代码的实质说白了就是用本地保存的内容逐一的以程序的方式更新到tpspecs中。他的结果与将本地文件的内容打印出来,然后将tpspecs中的记录全部删除,再手工一条条重新录入的,再更新保存回服务器是完全一致的,内容的更新语句还是由delphi自动生成的。
我想现在我讲的应该是够明白了吧,呵呵。
 
楼上的方法可以。
另客户端ClientDataSET。DATA本来就是个数据集,直接通过接口方法将olevariant将CDS
传到应用层,在应用层的方法将数据保存到数据库就OK了,至于保存方法很多,先删除原来的再保存,或修改更新等都可以
 
以前不记得用的什么方法,可以提交修改、添加,但不能提交删除;现在换这个方法了,连提交修改、添加都不行了,帮我看看这个函数有什么问题没,老是保存不了:
function SaveDataSet(CustomDataSet:TClientDataSet;mFileName:string):Boolean;
var
i:integer;
begin
Result:=False;
try
cdsCommon.CommandText:=CustomDataSet.CommandText;
cdsCommon.ProviderName:=CustomDataSet.ProviderName;
cdsCommon.Open;
cdsCommon.First;
while not cdsCommon.Eofdo
begin
cdsCommon.Delete;
end;

CustomDataSet.First;
while not CustomDataSet.Eofdo
begin
cdsCommon.Append;
for i:=0 to CustomDataSet.FieldCount-1do
begin
if cdsCommon.State<>dsEdit then
cdsCommon.Edit;
case CustomDataSet.Fields.DataType of
ftString : cdsCommon.Fields.AsString := CustomDataSet.Fields.AsString;
ftAutoInc : cdsCommon.Fields.AsInteger := CustomDataSet.Fields.AsInteger;
ftInteger : cdsCommon.Fields.AsInteger := CustomDataSet.Fields.AsInteger;
ftLargeint: cdsCommon.Fields.AsInteger := CustomDataSet.Fields.AsInteger;
ftBoolean : cdsCommon.Fields.AsBoolean := CustomDataSet.Fields.AsBoolean;
ftFloat : cdsCommon.Fields.AsFloat := CustomDataSet.Fields.AsFloat;
ftDateTime: cdsCommon.Fields.AsDateTime:= CustomDataSet.Fields.AsDateTime;
ftUnknown : cdsCommon.Fields.AsVariant := CustomDataSet.Fields.AsVariant;
else
cdsCommon.Fields.AsVariant:=CustomDataSet.Fields.AsVariant;
end;

// cdsCommon.Fields.Value:=CustomDataSet.Fields.Value;
//用这句代替上面的case...of也不行
end;
CustomDataSet.Next;
end;

cdsCommon.ApplyUpdates(0);//已执行
CustomDataSet.SaveToFile(mFileName);//已执行
except on E:Exceptiondo
ShowMessage(E.message);
end;
Result:=True;
end;
我用的是ACCESS数据库,SocketConnection连接,OnReconcileError中未捕获到信息
 
将loadfile后的cds的Data传到服务器上,服务器解析
Data中可以提起ADD,DEl的数据
Detal 可以提取Update的数据

当然,你要自己写代码模拟服务器解析功能
 
将LOADFROM FILE取得的数据集放用追加的方法放到要用来更新到SERVER上去的数据集中,并合并一下,必要时在数据库对应表中增加一个FIELD作为标志。
关键是看你LOADFROM FILE取得的数据集要如何处理:是全部追加、还是按KEY全部更新
 
后退
顶部