d6+ado+sqlserver2000+instead of 类型触发器(100分)

W

wqxsdly

Unregistered / Unconfirmed
GUEST, unregistred user!
两个基表
create table sp

spbh char(12) not null, --商品编号
spmc varchar(20) null, --商品名称
primary key (spbh)
)
go

create table khdafl
(
dadh integer not null, --单号
xh integer not null, --序号
spbh char(12) not null, --商品编号
primary key (dadh,xh)
)
go
还有一个 View
create view v_khdafl
as
select kk.dadh,kk.xh,kk.spbh,sp.spmc from sp,khdafl kk where kk.spbh=sp.spbh
go

在v_khdafl 上建触发器
create trigger tr_v_khdafl_insert on v_khdafl instead of insert
as
insert into khdafl (dadh,xh,spbh)
select dadh,xh,spbh from inserted
go

delphi6 中

adodataset1.commandtext的值为 select dadh,xh,spbh,spmc from v_khdafl

然后,在adodataset1中添加纪录,保存出现错误:
原因是delphi自动向两个基表各添加一条纪录,这与sqlserver的instead of 触发器
就不一致了
请教各位高手:如果还想用触发器的话,该怎样解决此问题?万分感谢!
注:在sqlserver客户端查询分析器里向v_khdafl表里添加数据很正常





 
帮帮忙了
 
gz~
希望大家能多讨论点触发器的问题~!
 
从来不用触发器
 
我想你可以直接插入到表khdafl中,为什么要用触发器呢?
 
好像ADO连接有触发器的表操作会出错,我不大清楚到底是不是ADO的bug
 
To weizi: 我是用Tadodataset 来查询编辑保存数据的。
To caochen: ADO连接有触发器的表操作不会出错,如果在触发器当中更新了其他表超过
一条纪录会出警告提示,你可以在触发器代码开始前加语句 set nocount on 来解决
 
帮忙啊,还可以加分的
 
一、你可以在本地建一个临时表,在保存时用insert 语句添加到表中。
二、我记得好像是ado本身会根据select 中的from语句判断表,自动将数据添加到数据库中,不用视图直接用adoquery也会存在这个问题。
三、可以使用bde。
四、用tadodataset也可以执行insert语句。
 
to weizi:谢谢你的回复
我知道此问题可以用别的方式来解决,但这样就不能利用sqlserver的instead of 触发器
了。你说的第二条是对的,我想知道的是如何让delphi(欺骗的方式也可以)不自动向两个基表
各添加一条纪录,而是向视图表中添加,这样触发器就会起作用。
我想用这种触发器,它对编程带来极大的方便与灵活性
 
不用数据库控件,直接用SQL语句可以:)
 
谁能帮我解决啊,另外送500分
 
再加分,解决问题1000分相送,这是我的家底了
 
用出发器会带来很多问题,所以再一次建议不要用出发七!
这是我的经验之谈,以前我同事也用过促发奇的,在insert时候,有问题,后来大家
都不用了。为什么非用粗发七呢?
 
To 一生中最爱:
谢谢你的建议,我喜欢用触发器,一直用着,还没出过问题。用触发器来维护数据的一致性
不仅方便,还极大的简化了客户端的编程,这只是我个人的看法,可能有些不合适的地方
 
触发器是好用!但就你这个问题来看,用触发器好象有点多余了,由于视图是基于基本表
的,你在一个可更新视图中插入或更新记录,相当于更新了此视图所使用的基本表,为什么
还可另外搞一个触发器干什么呢?
 
To 特尔斐:
先谢谢你的回复,看样子你还没明白我建触发器的意图。
我在视图上建一个触发器(注意,是instead of 类型触发器),就是想方便的控制哪些
基表、以及基表的哪些字段被更新。另外,也方便编程,把所有相关的表join到一个视图中
在客户端用一个TADODataset就可以对此视图进行更新。对数据库表的实际更新在触发其中
灵活控制。我想,这也是SQLSERVER2000数据库中有此类型触发器的主要用意所在。这在sqlserver2000
客户端查询分析工具中用的很正常。但在delphi6中,通过ADOdataset更新视图,它自作聪明的
向视图的每个基表发送更新命令(insert,update,delete)。
我想解决的问题,就是如何让delphi的ADOdataset把视图当作一个表一样来处理,这样,instead of
触发器就会起作用,达到我的目的。
当然,不一定非用此方法不可,这只是我的一个想法而已,说明Delphi对微软sqlserver的
instead of 触发器并不支持
希望大家能再讨论

 
你的思路比较有创意!
更新命令不使用TADOQuery、TADOTable等组件传递,而用TADOConnection的Execute方法
试一下看看。
 
To 特尔斐:
应该可以,不过太麻烦,需要自己组织SQL命令。和用TADOcommand差不多。
如果有类似BDE当中的updateSQL也可以啊,可惜,ADO中也没提供

 
顶部