一个简单的主从表(Master/Detail)问题(原以为很简单,给了50分,现在看来虽日常却不够简单,可再加150分!最后再加100分,总计达到300分!)

  • 主题发起人 主题发起人 Qingzhong
  • 开始时间 开始时间
Q

Qingzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
一个简单的主从表(Master/Detail)问题(原以为很简单,给了50分,现在看来虽日常却不够简单,可再加150分!最后再加100分,总计达到300分!) (50分)<br />错误提示“非空列不能更新为Null”

李维ADO书上的一个例子:
数据库: MS SQL Server 7.0
主表:
Essays (AutoID int IDENTITY (1,1) NOT NULL,
EssayName VarChar (50) NOT NULL,
EDate DateTime NULL,
Author VarChar (10) NULL)
Essays: 主键AutoID

从表:
EssayContent (AutoID int NOT NULL,
MDate DateTime NULL,
EssayContent text NULL)

ADOConnection连接到数据库,

ADOQueryMaster: select * from essays
DataSourceMaster: dataset := ADOQueryMaster
DBGridMaster: Datasource := DataSourceMaster
DBNavigatorMaster: Datasource := DataSourceMaster

ADOQueryDetail: select * from essayContent where autoid = :autoid
DataSource := DataSourceMaster
DataSourceDetail: dataset := ADOQueryDetail
DBGridDetail: DataSource := DataSourceDetail

按DBNavigatorMaster的(+)增加新记录,主从表均输入完毕,
按DBNavigatorMaster的Post试图自动保存主表和从表时,
出现提示:“非空列不能更新为Null”。

我想问题一定出在从表的AutoID上,我想正确的更新过程应该是:
先保存主表,取得主表记录的AutoId的值,
然后将该值写入从表的AutoId,最后再保存从表。

可这样要写一些代码,有没有不用写代码就能自动同时Post主表和从表的方法?
 
EssayContent AutoID不要设置成自动编号

在essaycontent beforeinsert里写
essaycontent.fieldbyname('id').asstring:=essay.fieldbyname('autoid')
大致思路是这样
 
Select A.Id,Isnull(B.name,'') as Name
from A Left outer join B oN A.id=B.id


這樣就不會出現Null了.試試吧.
 
TO shephard:
主表Essays没有保存之前,Essays的autoid值是未知的。
essaycontent.fieldbyname('autoid').asinteger:=essays.fieldbyname('autoid').asinteger
是不行的!
 
在从表的Query的Parameters属性里面江autoid字段添加上
 
以上的问题来自:
李维《Delphi 5.x ADO_MTS_COM+高级程序设计篇》
第二章<撰写使用ADO技术的应用系统(一)>中的
图2-32, 2-33,2-34等三个图。

特别是“在图2-33的范例应用程序新增完数据之后,点选TDbNavigator的Post按钮,
MS SQL Profiler显示了图2-34的执行过程。”如何能做到这一句话说的效果?

请给出具体实现的pas和dfm。

分不够可再加。
 
ado中可以指定autoincreasement的字段,你加上试试
 
你说的出现2-34的效果是什么意思,它就是在SQL SERVER端用profilter看到的SQL命令
来更新数据.
 
既然你的主表使用自增量字段,那么就没有修改主表自增量字段的必要,
也就不存在你说的问题.
//我是这样认为的,关注此题,欢迎与我讨论此问题,QQ:53320295
 
To hbezwwl:
我要的效果就是,当同时新增了Master和Detail的记录后,
按DBNavigatorMaster的Post能同时更新主从表。
 
"自力更生 丰衣足食",自己已经解决,自己研究出了完美的方案.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部