装的是Delphi7,安装时选择的是Office Xp。
使用的Office版本为,Office2002,在Access建表时,主窗口显示的是“Access 2000格式”主表
MainID    (自动编号)
Name      (文本)
Sex       (文本)从表
ID        (自动编号)
MainID    (长整型数字)
Company   (公司)在ACCESS的“工具”-“关系”中,将主表中的MainID与从表中的Main做一对多的关系。
Delphi设置
主表ADODataSet
主表DataSource1 (用于做主从关联)
主表DataSource2 (用于其它DataControls的DataSource设置)从表ADODataSet (DataSource设置的为主表DataSource1;MasterFields也做了与主表的关联)
从表DataSource (用于其它DataControls的DataSource设置)Locktype均设置为:ltBatchOptimistic
CursorType: ctStatic
CursorLocation: clUseClient
(ps:应该是跟上面这三项无关系,以前也做过类似的软件,也是这样的设置)
目前问题是:
做以下操作后
主表ADODataSet.Append;
主表ADODataSet.FieldByName('Name').AsString := '小王';
从表ADODataSet.Append;
从表ADODataSet.FieldByName('Company').AsString := 'A公司';
从表ADODataSet.Append;
从表ADODataSet.FieldByName('Company').AsString := 'B公司';从表中只显示一条数据项,可以说,从表中数据项的填写总是不正确。请问这是怎么回事呢?是不是我遗漏了哪?我曾经试过,就主表的MainID改为长整理,自已填写,也是无效的。(估计跟这个原因无关,因为在ACCESS中做操作是没问题的)
我曾经试过,取消主表从表的关系,仅对从表做简单的数据Append操作。也没问题,应该跟ADO等数据库联接没问题)请问这是什么原因?很急很急!谢谢。

解决方案 »

  1.   

    用ltBatchOptimistic或三层更新,就不要用自增字段,字段也不要设默认值.
    因为自增字段是提交后数据库自己生成,除非你提交后close再次open,否则程序里的值和数据库中的值会不一致,更新会出错.你从表append后要设置从表.MainID=主表.id,access中的关系在你的程序里无效,要手动设置ID
      

  2.   

    首先谢谢楼上的。
    你从表append后要设置从表.MainID=主表.id,access中的关系在你的程序里无效,要手动设置ID
    Re:
    从表ADODataSet (DataSource设置的为主表DataSource1;MasterFields也做了与主表的关联)
    是不是这样就算是设置了?难道要在CommandText中写SQL语句吗?
    我的SQL语句都是直接的Select .... from 主表(从表)
    没有写where条件的。用ltBatchOptimistic或三层更新,就不要用自增字段,字段也不要设默认值.
    re:这个我再试试,不过我试过貌似无效。奇怪了。
      

  3.   

    to ysai:主表的MainID我取消自增了,但还是不行。to 78hgdong:我的操作是这样的,在Access中,点“工具”-“关系”
    然后,将主表中的MainID,拖动到从表中的MainID上,在弹出的“编辑关系”对话框中,选择“实施参照完整性”和“级联删除相关记录”,关系的类型是:一对多。
    目前的问题就是:
    做以下操作后
    主表ADODataSet.Append;
    主表ADODataSet.FieldByName('Name').AsString := '小王';
    从表ADODataSet.Append;
    从表ADODataSet.FieldByName('Company').AsString := 'A公司';
    从表ADODataSet.Append;
    从表ADODataSet.FieldByName('Company').AsString := 'B公司';从表不增加新的记录。能过显示出的数据项,从表中的MainID已从主表取得。
    但是再进行Append操作,原先写好的从表的第一条记录,马上变成了空白。总是无法填加第二条记录。
    急急,请帮帮忙,谢谢。
      

  4.   

    貌似,我找到问题的原因了。
    只要我将代码改成:
    主表ADODataSet.Append;
    主表ADODataSet.FieldByName('MainID').AsInteger := GetMaxID;
    主表ADODataSet.Post;从表ADODataSet.Append;
    从表ADODataSet.FieldByName('Company').AsString := 'A公司';
    从表ADODataSet.Append;
    从表ADODataSet.FieldByName('Company').AsString := 'B公司';就可以解决问题。
    就是先将主表Post一下,再填从表的内容就可以了。但是现在有这么一个问题。
    由于我是用的:ltBatchOptimistic模式,当我做了上述操作后,主表和从表UpdateBatch()后,数据可以保存。
    但当我不想保存目前编辑的数据,主表和从表CancelBatch()就会出现异常错误!而有时退出程序时也会出现异常,这是怎么回事?
    如何修正程序?还是,就是上面我先将主表Post一下,这种方法对吗?有更恰当的方法吗?谢谢。
      

  5.   

    用事务控制一下,先提交主表,如果有异常Rollback就可以了