关于ClientDataSet的Delta问题
其实这个东西我最近才开始弄 由于没有系统的学习和教详尽的教程 我也没太弄明白。
我用的是firebird数据库 服务器使用的TSQLConnection 和 TDataSetProvider
客户端使用ClientDataSet 连接DataSnap
我现在差不多都是使用CommandText在查询数据 因为我没用数据感知组件DBGrid之类什么的 所以都是循环从ClientDataSet里面把数据取出来然后放到对应的Edit里面。
现在的问题就是 我知道如果使用数据感知组件DBGird之类的 和ClientDataSet连起来 然后在DBGird里面修改后 最后可以使用ApplyUpdate(0)来一次性提交修改。
但是就是怎么使用Delta更新数据呢?
我看了一点使用Delta更新数据的资料 有点不太明白
因为我是直接从ClientDataSet里面取出来放到各个Edit里面的 现在就是难道我是用ComandText取出数据 但是我怎么改ClientDataSet里面的数据才会让Delta里面有修改的记录呢?
然后我再把Delta传给服务器再修改?就是这里有点晕 如果能给一点详细的示例代码就最好了
[解决办法]
if not VarisNull(delta) then
begin
Cdsupdate.Close;
Cdsupdate.Data:=delta;
if not Cdsupdate.Active then Cdsupdate.Open;
if CDSupdate.RecordCount>0 then
begin
Begintrans;
CDSupdate.First;
s1:='';
s2:='';
while not CDSupdate.Eof do
begin
CmdStr:='';
case Cdsupdate.UpdateStatus of //根据当前记录的状态生成相应的SQL语句。
usUnmodified:
begin
end;
usModified:
begin
end;
usInserted:
begin
end;
usDeleted:
begin
end;
end;
if CmdStr<>'' then
begin
try
with ExecSQLADO do
begin
close;
sql.Clear;
sql.Text:=CmdStr;
writelog(cmdstr);
Execsql;
AlreadyPost:=True;
end;
except
AlreadyPost:=False;
ExceptionObj := ExceptObject;
if ExceptionObj <> nil then
begin
writelog(ExceptionObj.ToString);
msg:=ExceptionObj.ToString;
end;
//break;
end;
end;
cdsupdate.Next;
end;
[解决办法]
TClientDataSet-> TEdit -> TClientDataSet -> TClientDataSet.ApplyUpdate
Delta 已经是修改的数据了,用它再做修改?
TClientDataSet.Edit;
TClientDataSet.FieldByName('xx').AsString := '1234';
TClientDataSet.Post;
这个结构,Delta 就会变化呢了。
(希望,你的 sql 是从一张表里取的,否则,这个ApplyUpdate还需要在“服务器”端,加代码。)