ADO数据连接,通过调用应用服务器的接口来控制数据更新异常,请了解三层架构的朋友提供帮忙。 ( 积分: 200 )

  • 主题发起人 主题发起人 jeeh
  • 开始时间 开始时间
J

jeeh

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:
我在应用服务器上定义了一个function(也是对应一个接口),用来调用dsp控制更新数据。方法如下:
function TCOAppSrv.UpdateData(const SQL: WideString;
const TableName:
WideString;
var Delta: OleVariant): Integer;
begin
if VarIsEmpty(Delta) then
Exit;
try
//取得更新目的表的结构
qryCheckdata.Close;
qryCheckdata.SQL.Text := 'select * from '+TableName+' where 1=0 ';
qryCheckdata.Open;
qryUpdateData.Close;
qryUpdateData.SQL.Text := SQL;
dspUpdateData.ApplyUpdates(Delta, 0, Result);
except
raise Exception.Create('更新数据出错!');
end;
end;
end;

dspUpdateData的DataSet属性连接到qryUpdateData(adoQuery),其Option属性为[poAllowMultiRecordUpdates,poAllowCommandText],UpdateMode属性为upWhereChanged;
客户端调用语句是:
DCOMConn.AppServer.UpdateData(SQL, ADataSet.Delta);
出现的问题是:只要我在客户端更新一笔数据,保存时应用服务器会把所有与被更新数据一样的,都更新了。如表中有3笔记录,其中editFlag字段都是'10101'。但我只要改第一笔记录的editFlag为'10105'。可结果是所有的'10101',都变成'10105'了。?????
其中的SQL语句一般是这:select * from TableName.'TableName即为目的表。
我的开发环境是:Win2K Server + D7.没有使用第三方控件。
 
请问:
我在应用服务器上定义了一个function(也是对应一个接口),用来调用dsp控制更新数据。方法如下:
function TCOAppSrv.UpdateData(const SQL: WideString;
const TableName:
WideString;
var Delta: OleVariant): Integer;
begin
if VarIsEmpty(Delta) then
Exit;
try
//取得更新目的表的结构
qryCheckdata.Close;
qryCheckdata.SQL.Text := 'select * from '+TableName+' where 1=0 ';
qryCheckdata.Open;
qryUpdateData.Close;
qryUpdateData.SQL.Text := SQL;
dspUpdateData.ApplyUpdates(Delta, 0, Result);
except
raise Exception.Create('更新数据出错!');
end;
end;
end;

dspUpdateData的DataSet属性连接到qryUpdateData(adoQuery),其Option属性为[poAllowMultiRecordUpdates,poAllowCommandText],UpdateMode属性为upWhereChanged;
客户端调用语句是:
DCOMConn.AppServer.UpdateData(SQL, ADataSet.Delta);
出现的问题是:只要我在客户端更新一笔数据,保存时应用服务器会把所有与被更新数据一样的,都更新了。如表中有3笔记录,其中editFlag字段都是'10101'。但我只要改第一笔记录的editFlag为'10105'。可结果是所有的'10101',都变成'10105'了。?????
其中的SQL语句一般是这:select * from TableName.'TableName即为目的表。
我的开发环境是:Win2K Server + D7.没有使用第三方控件。
 
[blue]做了些改动,把dspUpdateDate的Options属性去掉,UpdateMode改为upWhereAll。再更新数据时,不会出现上述的把一样数据都更新的状况了[/blue]。但是出现了另一问题:一次只能更新一个表,如果有联动动作,则不能实现。比如,在更新A表的某一字段时,要相应的更新B表时就会出错了。请教各位大虾问题出在哪里?[:(]
 
多表更新的問題很難處理,你最好依據傳回來的數據自己編寫代碼分別更新至表中,而不要直接更新。
 
这样做的目的就是想自己控制数据的更新啊[?]
 
對,本來就應該這樣,在服務器端的clientdataset的beforeupdaterecord事件中編寫代碼。
建議你看一下李維的<<delphi 5.x 多層分布式應用系統篇>>,書中有詳細的講述多表更新的問題。
 
这本书我也在看,但上面给的例子与我想要的结果不一样。他是通过连接多个dsp来分别更新的,而我想要的结果是只用同一个通道。
请问可以给个多表更新的实例吗?非常感谢@!
 
用多個和用一個其實是差不多的,同樣也是拆解傳回來的數據字段,用於分別更新。具體的例子我現在也沒有。
 
受到启发了,谢谢hotboys
正在trying.
 
今天搞了一天还是没弄好。晕啊![:(]
我是通过这个接口来更新数据的,Client端调用这个接口时把参数传进来,就可以由应用服务器的dsp去更新了。但现在是一次只改一个表,是没问题的。但如果要在一个过程中,修改到多个表(每改一个表提交一次),这样就不行了。dsp的ResolveToDataSet为True or False,其效果一样。真是郁闷哪![?][?][?]
请各位大侠给点提示啊。帮着顶一顶也非常感谢!
 
我没明白你的:
但如果要在一个过程中,修改到多个表(每改一个表提交一次),这样就不行了。
是不是在客户端调用多次该方法修改不同的表?
等我明天试验一下
 
前两天一直登录不了DFW,不知道是怎么一回事?好像这个论坛有些问题。[?]
不过这个问题终于解决了,原来是SQL表中所定义的字段类型有nvarchar的,这个原因引起更新不成功。谢谢豆豆糖&hotboys提供帮助,可以散分了。
但是,[red][h4]为什么nvarchar类型的字段会影响到更新呢[/h4][/red]?这个问题不知道有谁碰到过,还请提供信息。
 
分赃不均,楼主可耻!他就这样答一下就150?
 
非也,非也。
在线下他可给了实例,哈哈,那是你不知道的。
 
后退
顶部