Delphi_SocketConn三层数据保存.解决办法
Delphi_SocketConn三层数据保存.
数据库
SqlServer2005
服务端
TDataSetProvider-->TAdoQuery-->TAdoConnection
客户端
TClientDataSet
动作:
结果集(服务端)-->TClientDataSet(客户端)-->显示-->新增,修改,删除-->保存.
分析:
1,如果 结果集是 Select * From A
新增,修改,删除
保存<(服务端)TDataSetProvider.ApplyUpdates(vDelta,0,vErrorInt)>
一切Ok,没有任何问题.
2,如果 结果集是 Select A.*,B.Name From A,B Where A.ID=B.ID
新增,修改,删除
保存<(服务端)TDataSetProvider.ApplyUpdates(vDelta,0,vErrorInt)>
------------------------------------------我只想保存针对A表的修改.
出错! Why?????
服务端保存函数:
function SaveSqlNote(TempAdoConn:TADOConnection; const vTabName, vSqlStr: WideString; var vDelta:OleVariant):Integer;
var
vErrorInt:Integer;
TempAdoQuery:TADOQuery;
TempDsp:TDataSetProvider;
begin
try
TempAdoQuery:=TADOQuery.Create(nil);
TempDsp:=TDataSetProvider.Create(nil);
TempAdoQuery.Connection:=TempAdoConn;
TempAdoQuery.Close;
TempAdoQuery.SQL.Clear;
TempAdoQuery.SQL.Text:=vSqlStr;
TempDsp.DataSet:=TempAdoQuery;
TempDsp.ApplyUpdates(vDelta,0,vErrorInt);
except
vErrorInt:=-1;
end;
try
TempDsp.Free;
TempAdoQuery.Free;
except
;
end;
Result:=vErrorInt;
end;
服务端接口:
function TTempServer.InterfaceSaveNote(const vTableName, vSqlStr: WideString; var vDelta: OleVariant): OleVariant;
begin
Result:=SaveSqlNote(DM.ADOConn,vTableName,vSqlStr,vDelta);
end;
客户端调用:
vTableName:='A';
vSqlStr:='Select * From A ';
vDelta:=ClientDataSet1.Delta;
vResult:=SocketConnection1.AppServer.InterfaceSaveNote(vTableName,vSqlStr,vDelta);
谁哪位能给指点下迷津啊,,,,或者有示例程序..?能不能发我一份..谢谢.
------解决方案--------------------
别指望了,midas不支持多表连接的更新。
建议你另走他途,可选方法如下:
1.用计算字段,
2.自己产生sql更新语句
3.自己封装一个clientdataset控件,在其内部维护一个专用于数据更新的内部clientdataset(只select那个要更新的表),再两者之间的数据同步。(我就是这么干的)
------解决方案--------------------
同意楼上的,我主要用update来更新
------解决方案--------------------
设计上就不对,更新等一定要用SQL语句去实现,这是原则问题,对于扩展,维护都是有益的。再说根本不可能实现多表更新的,因为几个表有相同的字段,控件哪知道你要更新哪个呀。
数据库
SqlServer2005
服务端
TDataSetProvider-->TAdoQuery-->TAdoConnection
客户端
TClientDataSet
动作:
结果集(服务端)-->TClientDataSet(客户端)-->显示-->新增,修改,删除-->保存.
分析:
1,如果 结果集是 Select * From A
新增,修改,删除
保存<(服务端)TDataSetProvider.ApplyUpdates(vDelta,0,vErrorInt)>
一切Ok,没有任何问题.
2,如果 结果集是 Select A.*,B.Name From A,B Where A.ID=B.ID
新增,修改,删除
保存<(服务端)TDataSetProvider.ApplyUpdates(vDelta,0,vErrorInt)>
------------------------------------------我只想保存针对A表的修改.
出错! Why?????
服务端保存函数:
function SaveSqlNote(TempAdoConn:TADOConnection; const vTabName, vSqlStr: WideString; var vDelta:OleVariant):Integer;
var
vErrorInt:Integer;
TempAdoQuery:TADOQuery;
TempDsp:TDataSetProvider;
begin
try
TempAdoQuery:=TADOQuery.Create(nil);
TempDsp:=TDataSetProvider.Create(nil);
TempAdoQuery.Connection:=TempAdoConn;
TempAdoQuery.Close;
TempAdoQuery.SQL.Clear;
TempAdoQuery.SQL.Text:=vSqlStr;
TempDsp.DataSet:=TempAdoQuery;
TempDsp.ApplyUpdates(vDelta,0,vErrorInt);
except
vErrorInt:=-1;
end;
try
TempDsp.Free;
TempAdoQuery.Free;
except
;
end;
Result:=vErrorInt;
end;
服务端接口:
function TTempServer.InterfaceSaveNote(const vTableName, vSqlStr: WideString; var vDelta: OleVariant): OleVariant;
begin
Result:=SaveSqlNote(DM.ADOConn,vTableName,vSqlStr,vDelta);
end;
客户端调用:
vTableName:='A';
vSqlStr:='Select * From A ';
vDelta:=ClientDataSet1.Delta;
vResult:=SocketConnection1.AppServer.InterfaceSaveNote(vTableName,vSqlStr,vDelta);
谁哪位能给指点下迷津啊,,,,或者有示例程序..?能不能发我一份..谢谢.
------解决方案--------------------
别指望了,midas不支持多表连接的更新。
建议你另走他途,可选方法如下:
1.用计算字段,
2.自己产生sql更新语句
3.自己封装一个clientdataset控件,在其内部维护一个专用于数据更新的内部clientdataset(只select那个要更新的表),再两者之间的数据同步。(我就是这么干的)
------解决方案--------------------
同意楼上的,我主要用update来更新
------解决方案--------------------
设计上就不对,更新等一定要用SQL语句去实现,这是原则问题,对于扩展,维护都是有益的。再说根本不可能实现多表更新的,因为几个表有相同的字段,控件哪知道你要更新哪个呀。