请问如何判断ClientDataSet.Delta是否为Empty(50分)

  • 主题发起人 主题发起人 createnew
  • 开始时间 开始时间
C

createnew

Unregistered / Unconfirmed
GUEST, unregistred user!
有这样的函数吗?
不要告诉我用Try Except
 
它是OleVariant类型 用NIL试试
 
VarType(ClientDataSet.Delta)
varEmpty The variant is Unassigned.
varNull The variant is Null.
 
也许是我没有把问题说请楚:
我在对一个主从表进行修改后要给中间层保存,在保存之前我要判断一下主表和从表是否
被修改过了,所以对Delta是否为空进行判断,可我用VarIsNull或VarIsEmpty等进行判断时
都出错:Variant Is Empty.我又没有找到相应不报错的函数.
 
用If Not varisNull(Clientdataset.Delta) then
......
因为Delta是OleVariant类型,不行的话声明一个OleVariant变量x,x:=ClientDataset.Delta
然后判断该变量
 
jjzhou_2001, antic_ant你们的方法不行
 
if varisempty(clientdatset.delta) and varisnull(clientdatset.delta) then
变量为空;
 
nsj也不行,你们可以试一下,在运行到这一步时出现
EDBClient错误:Delta is Empty.
 
try
oleDelta := Clientdataset.delta
except
oleDelta := Null;
end;
 
为什么不使用ChangeCount属性判断是否修改了呢?
还是书没有看得够多
 
hsw:你这样当然可以,我也知道。问题是这一类oldVariant的变量
(如ClientDataSet.Data)是否有值,在检查用户的输入错误时方便一些。
 
我同意hsw的写法 李维大哥的书上就有详细的说明不知道兄弟们看过否。
是《分布式多层应用系统》[:)]
 
使用ChangeCount属性
 
if clientdataset1.state in [dsedit,dsinsert] then
clientdataset1.post;
if clientdataset1.changecount>0 then

begin
//处理有更新或者有内容的情况
end else
begin
//处理无更新或者无内容的情况
end
 
是这样的,我在Client端修改了数据,用中间的协调层的函数保存了,因为不是用
系统的update所以保存后本地的delta不清空。如果我在本地又删除了此记录,则delta
又为空,这当然不是我要的。现在我只有在保存后用Close和OPEN一次,可速度又不好。
所以我想可以判断一个delta是不是为空,或把delta清空,不知各位是怎么处理的。
 
try this:
var
TempDataSet: TClientDataSet;
begin
TempDataSet := TClientDataSet.Create(nil)
try
TempDataSet.Data := YourCDS.Delta;
// pass the delta to another ClientDataSet
if TempDataSet.IsEmpty then

do
something ....
finally
FreeAndNil(TempDataSet);
end;
end;
 
to:createnew
客户端Delta的清空你可以用MergeChangeLog这个过程。
如果Delta为空的判断你不用try..except的话,也可以去修改DBClient.pas的源码
function TClientDataSet.GetDelta: OleVariant;
var
FDeltaDS: IDSBase;
TempPacket: TDataPacket;
ErrFlag: DBResult;
/////
begin
CheckBrowseMode;
ErrFlag := FDSBase.GetDelta(FDeltaDS);
if ErrFlag <> 16835 then
begin
///这个错误代码我忘了,你可以跟踪一下
Check(ErrFlag);
FreeDataPacket(FDeltaPacket);
Check(FDeltaDS.StreamDS(FDeltaPacket));
SafeArrayCopy(FDeltaPacket, TempPacket);
DataPacketToVariant(TempPacket, Result);
end else
Result := nil;
end;

 
if ClientDataSet1.ChangeCount > 0 then
begin
ClientDataSet1.ApplyUpdates(-1);
end;
 
Use ChangeCount:
ClientDataSet.ChangeCount = 0 ==> ClientDataSet.Delta: Empty
ClientDataSet.ChangeCount > 0 ==> ClientDataSet.Delta: Not Empty
 
后退
顶部