这真的是 Midas 的Bug吗???(不可思议) (100分)

  • 主题发起人 主题发起人 xeen
  • 开始时间 开始时间
X

xeen

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端 ADO 连接,DataSetProvider的ResolveToDataSet设为True;
客户端SocketConnection->ClientDataset->dataSource->dbgrid;
表中有某一字段(字段a)[red]内容一样[/red]的两条记录,([red]有关键字段,不是重复纪录[/red])
修改[blue]第二条[/blue]记录的字段a的内容,然后Clientdataset1.Applyupdates(-1);
这个函数返回0表示没有更新错误,然后Clientdataset1.Refresh;
结果发现......................................
[red]是[blue]第一条[/blue]记录的字段A被修改了[/red]
这是怎么回事?????
看来象是定位错误,查一了一通源码,还没有太多头绪。
是否有和我一样倒霉的人???
 
1 表要有主键或唯一索引
2 结果集中最好含有主键或唯一索引字段
 
如果这真是Midas的bug,我对它的信心要降到0了。
Delphi也不想用了.
 
返回0当然是没有错误了,只不过是更新没有错误所以更新成功了
这种问题可以是排序或者索引所造成的你可以找两条不同的记录更新看一下
这种错误基本不可能是bug
 
對,事情就是這樣的,這不是MIDAS的錯誤,如果數據庫裡面有兩條一模一樣的記錄,請問你如果用SQL去更新你將怎麼寫這個SQL?
還有,數據庫裡面為什麼會有兩條一模一樣的記錄?這是你建模的問題,而不是MIDAS的問題。
 
To xzh2000:
可是我的数据表中有关键字段了,而且字段A不是关键字段.
ApplyUdates却更新了另一条记录.
To 52Free:
我也怀疑不过即使没有索引似乎也会出错误.
 
To keepyea:
这个我当然知道,否则不用到Midas也出错了.
 
更新方式有问题,ADO的bug也说不定的
 
希望大家作个实验,其实我也觉得不是bug.(否则Delphi就.......)
不过现在在两个机器不同数据源上得到了同样的结果-(
 
将DataSetProvider的 UpdateMode 改为 upWhereKeyOnly 或者 upWhereChanged
然后,试一下
 
To LiChaoHui:
DataSetProvider的ResolveToDataSet设为True的时候,UpdateMode的值
应该是不起作用的.
 
【何出此言?】
你试过了?
还有,数据集中的字段对象有个属性 ProviderFlags 似乎和更新定位记录有关
你先试试吧, 行了告诉我
 
DataSetProvider 设 ResolveToDataSet 为 True 时, 将通过其连接的 DataSet
进行数据更新, 而此 DataSet 的SQL语句就很重要了...
 
NND,好久没发言了,过过瘾........闷了好久啊.............
 
DataSet的更新语句又不是自己写的,
关键是进行主键方式更新,才能准确定位记录
 
单表更新还是多表更新,还有用SQL跟踪器跟踪一下SQL
 
To LiChaoHui:
我前面确实错了,ResolveToDataSet设为True的时候,UpdateMode的值
应该是起作用的.
问题的关键在TDataSetProvider.FindRecord源码中.
前面的错误是由于TDataSet.Locate在UpdateMode为upWhereChanged的时候发生
错误引起的,我觉得应该算个bug.
Ps:我才知道Midas用Locate方法来定位要修改的记录,如果记录集有上万记录,那速度....
 
所以说不要用ResolveToDataSet=True,在BeforeUpdateRecords自己写SQL或者用
UpdateSQL
 
你可以试一下,并不慢的,上万条记录也没什么的
 
To LiChaoHui:
当你设定UpdateMode为upWhereChanged的时候就会有我问题了,所有ProviderFlags 包含
pfInWhere属性的字段都会加入Locate列表,一些Memo字段还会出错。
 

Similar threads

回复
0
查看
867
不得闲
回复
0
查看
621
不得闲
回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部