菜鸟送分问题--主-明细表问题的困扰(100分)

  • 主题发起人 主题发起人 i2346
  • 开始时间 开始时间
I

i2346

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ADO连接数据库,数据库为SQL SERVER2000,关联表之间已经定义了外键。

当使用TADOTABLE中定义了子表MasterSource和MasterFields的主-明细关系后
当对子表的进行插入新记录的操作提交时,发生以下错误(主表相当字段已填
写,并未有重复值):
raised exception class EOleException with message'INSERT statement
conflicted with COLUMN FOREIGN KEY constraint 'FK_MInList_MInMain'.
The conflict occurred in database 'DataSQL',table 'InMain',
column'OrderNo''.

OK,于是我就关闭了在SQL SERVER2000中InMain和InList之间的“对INSERT和
UPDATE强制关系”。上面的问题不出现了,但又有两个问题:
1、关闭了“对INSERT和UPDATE强制关系”也就意味着关闭了“级联更新相关的字
段”和“级联删除相关的记录”。当我删除主表记录时,子表记录未能同时删除。
2、当在新的主表记录插入数据后,对子表插入记录时,TDBGRID只能显示一行新
记录(也就是已经输入的新记录无法显示),只要提交后,浏览其它主表记录后
返回回来才能看到对应的全部子表记录。
对出现的第二个问题,同样的也出现在李维的《ADO/MTS/COM+高级程序设计篇》
的主-明细表的例子中。第一个问题还可以通过手工编程方式得以实现子表的级
联删除。第二个问题呢?

后来我对开启在SQL SERVER2000中“对INSERT和UPDATE强制关系”以及其下的选
项的情况下,用李维的主-明细表通过TADOQUERY的SQL语句进行联接的方式,问题
不出现了(子表的SQL语句如下:SELECT * FROM INLIST WHERE ORDERNO=:ORDERNO
,并把子表的TADOQUERY的DATASOURCE设为主表对应的DATASOURCE)

另外还有一个问题,上面的两种方式下,我对INLIST表中的MATERIALNO与MATERIALS表
的MATERIALNO设置了外键,当我在INLIST的MATERIALNO中输入MATERIALS表中不存在
的数值时,系统不出错?为什么?

于是我就十分的郁闷.对于SQL SERVER及ACCESS(ACCESS的数据库同样出此问题)为
什么就不能用传统对MASTERSOURCE的设置以实现主-明细表的关系呢???

请各位大侠指教!!!!!


 
同志们!就不要混分,我的分也是不容易得来的。帮帮忙,给点意见嘛!我的命好苦呀:(
 
你的SQL语句时怎么写的??
 
上面说过了:SELECT * FROM INLIST WHERE ORDERNO=:ORDERNO
这个运行无误。
我现在的问题是在SQL SERVER2000中定义了外键后(两表关系中“对INSERT和
UPDATE强制关系”选中状态),用BDE或者是ADO都会在添加子表记录时出错!
WHY???
 
是不是子表insert时主表的记录尚未post
 
我对主,子表用的都是CACHEUPDATE,在APPLYUPDATE之间,子表也是未提交呀,怎会
出错呢?
 
从第二个问题看出似乎子表记录储存还在主表记录插入之前,如果是这个原因,
此时主表没有相应主键,应该会引起冲突
使用CACHEUPDATE时,主细表更新顺序很重要,一般是先主表后细表,而且应该在
APPLYUPDATE时同时更新两张表以维持同步关系
 
我的APPLYUPDATE是这么写的
database.applyupdate([Inmain,inlist]);
这有先后顺序呀。
而且为了避免代码上的错误,于是我去除这些人工处理代码,让它自己处理CACHEUPDATE的
过程,结果还是错误依旧。
 
系统不出错? 是ADO的BUG,李维已经讲过了吗?
 
关键的问题是,如果我不写任何的代码,直接用DELPHI的默认设置进行操作,在提交新子表
记录时,就出现外键错误。我认为不应该出现的。为什么呢?因为如果在这种最简易的情况
下还会出现这种错误的话,不是就不能使用ADO+SQL SERVER2000的构造,且在关联表之间不
能做什么“对INSERT和UPDATE强制关系”了?而这种结构是很常用的呀!
另外,为了避免因为疏忽而引起的错误,我就从新建了一个只有两个表,就是InMain和InList
两个表,并建立相关的关系。又新建了一个DELPHI项目,用系统默认值建立,并不写代码。
结果运行了以后还是出现同样的问题。
后来,我用ACCESS2000建立了一个数据库应用程序,实现对该数据库的访问(是ACCESS程序
不是数据库)没问题,接着我又用VB6,做了同样的程序,也没问题。以上都是采用系统默认
值建立。
于是,我想是不是DELPHI5的ADO有BUG(我已经升级过DELPHI的升级包和ADO的两个升级包),
我就用DELPHI6来写,结果问题同样的出现。
我想大侠们,能不能帮我试一下这个问题,是否在你的系统环境里,也会出同样的问题,
我另外已经开过一个相关的问题,也是100分,两个加起来有200分,谁帮我解决这个问题,
我愿意出300分。
小弟在此先行谢过了!
 
问题1:向sql提交新子表时主表相应主键是否存在?
问题2:在APPLYUPDATE后清空了cache,此时再refresh数据集试试。
 
to wu_yang兄:
回答一:向SQL提交新子表记录时主表相应该主键存在
回答二:所有的问题在APPLYUPDATE之前就已经存在,而且并非在多次运行后才出现问题,
而是第一次就出问题。
而且有个大问题是,李维书中的主-明细表例程在取消“对INSERT和UPDATE强制关系”后
出现新添新主表下对应子表记录的时候,DBGRID中只会显示当前正在新添的记录。
 
raised exception class EOleException with message'INSERT statement
conflicted with COLUMN FOREIGN KEY constraint 'FK_MInList_MInMain'.
The conflict occurred in database 'DataSQL',table 'InMain',
column'OrderNo''.

就错误的意思来说,似乎是产生了重复的组件,看仔细点阿,可能就能解决问题。
 
为了避免错误,我说过了——我新建了一个只有两个关联表的数据库及一个只用默认值建立
的新DELPHI项目,但问题同样存在。
 
To:
i2346
告訴你一個殘酷的辦法,解除安裝Delphi 5.0,然后重新安裝它.但一定記住,不要再安裝
Sp1!!!!!!!!!!!!!!!!!!!重新編譯原程序就可以了,完全不關SQL的事.不信你試試看.
我也是在使用Master/Detail程序時深受其害.不知是否在SP1中有新的Bug!!!!!!
害得我花了好多天時間,各種情況全試了,李維等人的書都翻爛了問題仍舊.
可是不安裝SP1,ADO的兩個packs沒法裝了,這不是有更大的Bug嗎?不知哪位好友有更好的
辦法!!!!!!!!!!!!!!!!!!!!
 
天哪!!那不是原来ADO的空记录集的错误又要出现,不是又非常郁闷???
 
我用Access做测试没有你所说的问题。
 
to Michael100:
你是说用ACCESS做的程序,而不是数据库吧?我也试过了,也没问题,但我要在DELPHI
中做的,而且要用SQL SERVER做数据库,因为很多的库存算法用SQL SERVER实现更好更快
 
真的没人能回答这个问题了吗?我认为SQL SERVER2000+DELPHI+主-明细表结构应该是很
常用的呀!为什么没人回答我的问题呢?我加分不行吗?除了这个贴子100分,还有
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=579973的100分,再加一百分,一
共三百分够吗?我只是想知道主-明细表的关键字同步能否由默认情况自己完成,而不用代
码实现,代码太麻烦了。而且我想照理应该是可实现的,为什么老出错呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部