S
shappy
Unregistered / Unconfirmed
GUEST, unregistred user!
在服务器端产生流水号有个好处,就是避免在多人并发操作时几个人同时使用同一个流水号添加数据,这是C/S架构无法实现的.流水号的产生方式有两种
1 在provider更新前查询数据库,自动产生流水号填写入数据集
2 利用数据库的自增长字段.
但是provider更改了流水号后,默认情况下无法把发生修改的字段刷新到客户端.实际上Midas的设计的时候已经考虑到这一点,在DataSetProvider的Option属性中有一个resolvetodataset的属性,表示服务器对记录的更新将返回给客户端并反映到客户端数据集中。不过Borload似乎是遗漏了一个步骤,还必须在provider的AfterUpdateRecord事件中添加如下代码,把ado中修改的数据更新到Delta中.
if (updatekind=ukinsert) then
begin
deltads.FieldByName('id').ReadOnly:=false;
deltads.FieldByName('id').NewValue:=qry1ID.Value;
end;
如果使用自增长字段,比如注意数据更新控件能否刷新字段值的问题,测试中发现,ado更新数据后可以自动刷新自增长字段数据,dbexpress则不行,如果用provider产生sql语句更新数据则更无法刷新数据,所以resolvetodataset必须是true.另外如果字段有Default值,而insert时没有指定该字段数值时需要注意,ado和dbexpress插入数据后都无法刷新default数据,所以更新时肯定会触发"record change by another user"错误,解决方法是不用数据库的default值,或客户端添加数据时自动赋值.
附:
DataSetProvider的Option属性
看看远端数据模块里的DataSetProvider的Option属性是否设置正确!Provider控件的Options属性值是一个集合,用于设置有关打包和传递的选项,像显示哪些字段、允许哪种更新方式等等。
1 poFetchBlobsOnDemand:若包含此项,则表示数据包中不包括BLOB字段。不过,如果客户端的TclientDataSet控件的FetchOnDemand属性设为True,那么客户端还是能自动地请求这些数据值;否则,客户端应用程序必须使用客户数据集的FetchBlobs方法来检索BOLB数据。
2 poFetchDetailsOnDemand: 当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则Detail表中的字段将不会放入包中。不过,如果客户端的TclientDataSet控件的FetchOnDemand属性为True;那么客户端还是能自动的请求这些数据;否则,要显式调用FetchDetails方法。
3 poIncFieldProps:若包含此项,则表示数据包中将包含下列字段属性:Alignment、MinValue、DisplayLabel、DisplayWidth、Visible、DidplayFormat、MaxValue、EditFormat、Currency、EditMask、DisplayValues等。
4 poCascadeDeletes:当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则当主表中的记录被删除时,明细表中相应的记录将自动地被删除。
注意,要使用这个选项,数据库服务器需要建立参照完整性:也就是,在数据库中对主细表建立主外键关系,并在“关系”页选中“级联更新相关字段”、“级联删除相关记录”。
5 poCascadeUpdates:当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则当主表中主键字段的值改变时,明细表中相应的记录将自动地被更新。
注意:要使用这个选项,数据库服务器需要建立参照完整性。参照4。
6 poReadOnly:若包含此项,则表示不允许客户端数据集向Provider申请更新数据。
7.poAllowMultiRecordUpdates:表示一个单一的更新将同时更新关联的许多表的记录,这有可能是通过触发、参照完整性或自定义的SQL语句来实现的。
8.poDisableEdits:若包含此项,则表示不允许客户端更新已经存在的数据值,否则,将触发异常。
9.poDisableInserts:若包含此项,则表示不允许客户端插入一个新的记录,否则,将触发异常。
10 poNoReset:若包含此项,则表示在提供数据前,不允许客户端将光标指定在第一条记录。
11 poAutoRefresh:若包含此项,则表示Provider将用当前的记录刷新客户端的数据集,而不管它是否已经申请更新。(这个功能好像并没有实现)
12 poPropogateChanges:若包含此项,则表示服务器对记录的更新将返回给客户端并反映到客户端数据集中。
13 poAllowCommandText:若包含此项,则表示客户端可以重载相关数据集的SQL语句、表的名字或存储过程。
http://www.cnblogs.com/shappy1978/archive/2007/06/14/783772.html
1 在provider更新前查询数据库,自动产生流水号填写入数据集
2 利用数据库的自增长字段.
但是provider更改了流水号后,默认情况下无法把发生修改的字段刷新到客户端.实际上Midas的设计的时候已经考虑到这一点,在DataSetProvider的Option属性中有一个resolvetodataset的属性,表示服务器对记录的更新将返回给客户端并反映到客户端数据集中。不过Borload似乎是遗漏了一个步骤,还必须在provider的AfterUpdateRecord事件中添加如下代码,把ado中修改的数据更新到Delta中.
if (updatekind=ukinsert) then
begin
deltads.FieldByName('id').ReadOnly:=false;
deltads.FieldByName('id').NewValue:=qry1ID.Value;
end;
如果使用自增长字段,比如注意数据更新控件能否刷新字段值的问题,测试中发现,ado更新数据后可以自动刷新自增长字段数据,dbexpress则不行,如果用provider产生sql语句更新数据则更无法刷新数据,所以resolvetodataset必须是true.另外如果字段有Default值,而insert时没有指定该字段数值时需要注意,ado和dbexpress插入数据后都无法刷新default数据,所以更新时肯定会触发"record change by another user"错误,解决方法是不用数据库的default值,或客户端添加数据时自动赋值.
附:
DataSetProvider的Option属性
看看远端数据模块里的DataSetProvider的Option属性是否设置正确!Provider控件的Options属性值是一个集合,用于设置有关打包和传递的选项,像显示哪些字段、允许哪种更新方式等等。
1 poFetchBlobsOnDemand:若包含此项,则表示数据包中不包括BLOB字段。不过,如果客户端的TclientDataSet控件的FetchOnDemand属性设为True,那么客户端还是能自动地请求这些数据值;否则,客户端应用程序必须使用客户数据集的FetchBlobs方法来检索BOLB数据。
2 poFetchDetailsOnDemand: 当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则Detail表中的字段将不会放入包中。不过,如果客户端的TclientDataSet控件的FetchOnDemand属性为True;那么客户端还是能自动的请求这些数据;否则,要显式调用FetchDetails方法。
3 poIncFieldProps:若包含此项,则表示数据包中将包含下列字段属性:Alignment、MinValue、DisplayLabel、DisplayWidth、Visible、DidplayFormat、MaxValue、EditFormat、Currency、EditMask、DisplayValues等。
4 poCascadeDeletes:当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则当主表中的记录被删除时,明细表中相应的记录将自动地被删除。
注意,要使用这个选项,数据库服务器需要建立参照完整性:也就是,在数据库中对主细表建立主外键关系,并在“关系”页选中“级联更新相关字段”、“级联删除相关记录”。
5 poCascadeUpdates:当用嵌套表的方式处理Master/Detail关系时,这里的Provider表示主/明细表中的主表。若包含此项,则当主表中主键字段的值改变时,明细表中相应的记录将自动地被更新。
注意:要使用这个选项,数据库服务器需要建立参照完整性。参照4。
6 poReadOnly:若包含此项,则表示不允许客户端数据集向Provider申请更新数据。
7.poAllowMultiRecordUpdates:表示一个单一的更新将同时更新关联的许多表的记录,这有可能是通过触发、参照完整性或自定义的SQL语句来实现的。
8.poDisableEdits:若包含此项,则表示不允许客户端更新已经存在的数据值,否则,将触发异常。
9.poDisableInserts:若包含此项,则表示不允许客户端插入一个新的记录,否则,将触发异常。
10 poNoReset:若包含此项,则表示在提供数据前,不允许客户端将光标指定在第一条记录。
11 poAutoRefresh:若包含此项,则表示Provider将用当前的记录刷新客户端的数据集,而不管它是否已经申请更新。(这个功能好像并没有实现)
12 poPropogateChanges:若包含此项,则表示服务器对记录的更新将返回给客户端并反映到客户端数据集中。
13 poAllowCommandText:若包含此项,则表示客户端可以重载相关数据集的SQL语句、表的名字或存储过程。
http://www.cnblogs.com/shappy1978/archive/2007/06/14/783772.html