最近在看<<Delphi 7高效数据库程序设计>>书后,总结了几个问题,
想在此向各位大虾请教。
 SQL:
 1)
 Create Table T1( FNO Int Identiry(100,3) Primary Key,FCode Varchar(8),FName Varchar(30) )
 2)
 Create Table T2( FNO Int Identiry(100,3) Primary Key,FCode Varchar(8),FSalary Money, ... )
 问题的展开是由上述之类的SQL语句产生的数据表引起的。 问题一、有关C/S下的ADO
 用 DataBase -> TAdoConnection -> TADOQuery -> Data Controls 连接数据库和数据感知组件
 当用如下SQL语句:
             Select T2.FCode,FName,FSalary
             From T2
             Left Join T1 on T2.FCode=T1.FCode
             Order By T2.FCode
 进行操作时,假设得到如下的数据集: FCode   FName   FSalary
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 A     aaaaaa   600
 B     bbbbbb   580
 C     ccccccc   650
 D     dddddd   600
      (数据集一) 请问,当我修改B记录的FCode字段,把字段内容由“B”改到“E”,
为什么按Refresh按钮不能刷新,也就是说FName字段的内容为什么不能
刷新为"eeeeee"?????
假设T1表中肯定存在着如下的记录:
 FCode   FName
 - - - - - - - - - - - - - - - - -
 A     aaaaaa
 B     bbbbbb
 C     ccccccc
 D     dddddd
 E     eeeeee
 ...  
      (数据集二) 或者用ADO操作数据集时有没有其他的办法处理此类的问题? 问题二、有关TADOQuery+TDataSetProvider+TClientDataSet
 由于一时找不到解决上述问题的办法,于是想到了类似MIDAS的方法来处理上述的操作。
 即在TDataSetProvider的BeforeUpdateRecord事件中拦截用户要更新的数据,用自己特定的
 SQL语句直接更新数据库中的数据。但问题就出现了,由于目前使用的两个数据表的主关键字
 (FNO)均没有直接出现在Select的语句中,因此类似D7书第228-229页中的的Delete和Update
 语句中的where条件的主关键字的OldValue无法找到。
 如:
  Delete from T2 where FNO = :OLD_FNO
  Update T2 Set FCode = :FCode,FSaraly = :FSaraly where FNO = :OLD_FNO
 请问在这种情况下,如何找到FNO的OldValue????? 当然如果在Select语句中包括了数据表的主关键字FNO,则就没有此问题了,但FNO有时仅为
 主关键字用而没有其他用处,难道一定要在Select语句中包括此没有用的字段(FNO)吗? 我用SQL的事件跟踪器看过,当在
 用DataBase -> TAdoConnection -> TADOQuery -> Data Controls 连接数据库和数据感知组件
 在TADOQuery的SQL属性中设置如下语句时:
 Select FCode,FName From T2
 更新数据集的数据时ADO却会找到主关键字(FNO)的OldValue,
 请问这又是为什么?
 ADO采用的是什么策略,是否此时数据集中就隐藏着主关键字(FNO)的字段? 问题三、有关TADOQuery+TDataSetProvider+TClientDataSet的刷新问题
 如问题二所述,当在Select语句中包括主关键字(FNO)时,也就不存在问题二了,但:
 如(数据集一),当按下TDBNavigator中的Last按钮,使数据集的当前记录指向
 最后一条记录(即D记录),按下键盘上向下的箭头键(↓)并插入如下记录:
 FCode   FName   FSalary
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 A1     a1     600
 此时数据集的当前记录就是此记录。
 当把此记录更新回数据库(用TClientDataSet.ApplyUpdates(0)方法)后,此记录在TDBGrid中的
 显示位置是最后一条记录,并且是此数据集的当前记录。
 由于Order By T2.FCode,当然此记录应该位于原数据集的A记录后B记录前,因此当按下
 TDBNavigator中的Refresh按钮后,此记录回到了其应该所处的位置(即原数据集的A记录后
 B记录前),但问题出现了:
 那就是数据集的当前记录由A1记录变成了D记录,请问这是为什么? 另外在按下Refresh按钮前,做了如下的操作:
 Var sBK:String;
           BK:TBookMark;
    begin
      sBK:=ClientDataSet1.BookMark;
      BK :=ClientDataSet1.GetBook;
    ...
    end;
 即保存数据集书签。
 但在按下Refresh按钮后,再怎么恢复数据集书签,也不可能使当前记录恢复到A1记录,
 当前记录始终是D记录,为什么?
 难道数据集书签中保存的就是当前记录相对于首记录的位置数字值吗?