单机单用户的情况下,MIDAS为什么会出现"Record changed by another user"的错误?(100分)

  • 主题发起人 主题发起人 hlsl
  • 开始时间 开始时间
H

hlsl

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如题,运行情况是这样的:单机调试,在浏览记录的界面下,删除一条记录,会出现该错误。这条错误信息是我从服务器取回来的。因为软件内部做了一些其他的配置工作。因此,我不知道具体是哪里出了问题。是否可以列举一下出现这个问题的必要条件
 
刚才听一个朋友讲,以前他也遇到这个问题。可能是应用服务器的问题,但是具体情况不是很清楚。哪位有这方面的经验?
 
你在读出数据后,如果由于某种原因,数据作了修改,客户端没有刷新,如果编辑数据,提交就会出这个错误
 
为数据表定义一个主键字段
 
TO wfzha
这种情况提示的错误是:"Must apply updated before refresh"
TO: axcom
数据表有主键的
 
呵呵,你不要用refresh,应该sql语句,然后重新open读出数据。
 
添句:
从客户端ApplyUpdate(0)一次,然后open;
 
兄弟
锁定了
 
各位:先说一句,我打开数据表——浏览界面中——删除一条数据——出错。但是有的记录就不会出错。还有:单机调试,就我一个人在用。
 
想应该是你数据库的默认值与你前台(Midas)字段的默认值不一致。
 
給你一點小提示﹐也許會有幫助。
1﹕數據是原先在數據中直接導入的﹐有些數據DELPHI讀出的與數據庫的實際數據
不符。如日期 Getdate()得到的值與DELPHI讀出的精度不同。
2﹕有些字段有DEFAULT VALUE。
good luck! ^_^
 
你是用dataset 控件直接更新的吧
建议用CLIENTDATASET.COMMANDTEXT:=SQL语句
更新
然后OPEN 就不会出错
 
有可能server的数据集有参数,客户端提交的时候没有给参数赋值,或者参数不正确。
 
provider的UpdateMode设置为upWhereKeyOnly
 
遇到过,记不详细,好像是服务器端的数据集控件是拷其他控件,把它删除重新加入就OK
 
各位,问题解决,是DELPHI的问题!没想到吧?我也很晕~~~~~
昨天我跟踪进VCL里面,原来ADO部分有问题。为了让大家不再出这个问题,我给个解释出来。
客户端这边修改后,要到服务器那边定位数据。到了服务器后,如果是用DATASET更新,那么服务器用ADODATASET的FILTER来定位数据。不知道各位注意到没有,ADODATASET.FILTER的数据类型是STRING,也就是说有长度限制:255个字符。我的那个表特别的大,字段有几十个,因此定位FILTER很长~~~~我跟踪到定位记录的地方的时候,就出了问题了:过滤串被截了一半~~~~,所以定位不成功,但是ADO根据结果来判断是否出错:如果有一条以下,就是"Record changed by another user",这个错误的提示确实有点偏了。如果是1条以上而且没有MultiRecordUpdate属性的话,就提示“更新多条记录”。另外,如果是使用SQL来更新数据的话(ResolverToDataSet为TRUE),因为最后是执行一条SQL——直接调用的接口,没法跟进去,所以不知道为什么出错。不过可能原因差不多。
所以,按照PIPI的做法,把“provider的UpdateMode设置为upWhereKeyOnly ”这样就没有问题了。因为如果是upWhereAll的话,就会用所有字段生成定位串(也就是过滤了)。
最后,我很奇怪,因为有的数据就可以定位成功,有的就不行。也许问题不一定是出在这里。不过把provider的UpdateMode设置为upWhereKeyOnly 确实可以解决问题。还有就是,前面我忘记打ADO的补丁了,所以打了之后不知道是否还会有这个问题。
感谢各位的参与,希望以后多多支持。
 
provider的UpdateMode设置为upWhereKeyOnly 并非解决ADODATASET.FILTER的问题
你认为string 只有255也是不对的,从delphi 2 or 3开始,string 就可以达到 2G 个字符了
 
我验证了一下STRING的长度,确实是这样的,我以前一直以为默认是ShortString呢。
不过,请问PIPI,这个问题具体是什么原因引起的呢?我试验的结果,确实是把UpdateMode设置为upWhereKeyOnly就可以了,而ALL就会出错.
再声明一下:单机调试,没有修改任何数据,执行删除操作.
另外,不知道为什么到了ADO里面的FILTER就会被截断。
我给出我跟踪的结果(Provider ResolverToDataSet = True),请看:
TDataSetResolver.DoDelete -> //Provider.pas 3144
Provider.FindRecord ->
Result := Source.Locate(Fields, KeyValues, []);
->
TCustomADODataSet.Locate -> //Provider.pas 2182
Result := LocateRecord(KeyFields, KeyValues, Options, True);
-> //ADODB.pas 4808
FLookupCursor.Filter := LocateFilter;
//ADODB.pas 4758
如果有兴趣的话,可以跟踪到这里来看一下,LocateFilter赋值给FLookupCursor.Filter后,如果长度大于255的那么多出来的部分被截断了.可以在IDE中修改一下这个FILTER看看.
FLookupCursor.Filter 是从接口Recordset15 继承下来的,类型为OleVariant.
另外,如果直接在IDE中给ADOTable.Filter一个大于255的字符串的话,也会被截断的,也就是TADOTable.Filter最大长度是255.这一点可以验证.
欢迎继续讨论,如果有必要,我可以另外开一个帖子。反正分多没有用的,呵呵。
 
我注意到:DB.pas文件中定义了{$H+}的编译指令,也就是为AnsiString类型。
但是为什么TDataSet.Filter有255的长度限制呢?难道属性的STRING必须是ShortString吗?
我把UpdateMode设置为upWhereKeyOnly可以减少Filter的长度到255以下,因此在某中程度上解决了这个问题。不过如果这个只是表面原因,那么这个问题的真正原因是什么?
 
在调试(跟踪)状态下,字符串是只做为ShortString显示的.
但是如果你用ShowMessage(DataSet.Filter)就可以看一完全的了.
 
后退
顶部