用过INSTEAD OF 触发器的高人请进(在线等候,如何禁止ADO的智能解析SQL功能?) (100分)

  • 主题发起人 主题发起人 sundart
  • 开始时间 开始时间
S

sundart

Unregistered / Unconfirmed
GUEST, unregistred user!
视图ViewDetail连接了两个表,如果对视图插入数据,
它会出错,“不能将‘NULL’值给XXX表的XXX字段”这类错误。

但我只想更新其中一个表的数据。

MS SQL的联机手册说INSTEAD OF 触发器可以解决。

试了一下,在SQL的查询分析器中对视图Insert了一条数据的确可以,
但的程序中却会出现前面的错误。
应该是ADO自动生成SQL引起的,如何禁止ADO做这种智能解析?
有大侠知道如何解决吗?
谢谢
 
你用的D5还是D6,ADO有没有升级?
 
如果只想更新其中一个表的数据,则不能使用视图
 
楼上的朋友可能对MS SQL 的INSTEAD OF 触发器还不太了解
我已经说过了,在SQL的查询分析器中对视图Insert了一条数据的确可以,
但在程序中用TADOQuery却会出错。
 
我也遇见过这问题,找了很久没有答案:(
关注……
 
你要好好看数据库,不要对视图进行直接操作,这样可能会出现你想不到的问题,
 
//你要好好看数据库,不要对视图进行直接操作,这样可能会出现你想不到的问题,
其实我也不想直接操作视图;
直接操作视图,原因是:
视图连接了人员列表和人员基本表;
我在录入人员列表时,只要录入人员ID,
其它年龄,身高等信息都可以从人员基本表中取.所以用了视图.

在保存数据时,我只要在人员列表中保存人员ID的值.
但是ADO的保存数据时会向两个表中插入数据,从而导致错误.

MS SQL的联机手册说INSTEAD OF 触发器可以解决。
试了一下,在SQL的查询分析器中对视图Insert了一条数据的确可以,
但程序中却会出错。

 
改直接向表,读取的时候从视图中取
 
//改直接向表,读取的时候从视图中取
我是用DBGrid输入数据, 怎么改?
 
instead of insert
insert into table1(col1,col2)
values(:new.col1,:new.col2)

大概就是这样!
 
楼上的朋友,你的SQL通不过.
我是这样写的:
CREATE TRIGGER Test ON 人员列表视图
INSTEAD OF Insert
As
Insert Into 人员列表(ID, 人员ID)
Select ID, 人员ID From Inserted

上面的在SQL查询器中执行: Insert Into 人员列表视图(ID,人员ID) Values(1, 1)
能正确执行,
但用ADOQuery连接人员列表视图,用DBGrid输入数据一保存就出错(错误信息如前面所示)
 
我试图用,但还没找到解决办法,我已经过测试,delphi还不支持instead of 触发器。
你看看我的贴子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1444366
 
wqxsdly,看来你也遇见过啊
其实这应该是ADO的问题,
我以前是根据视图建了个临时表来解决的,觉得不爽.
 
我在Oracle9iR2上试验了Instead of 触发器一次更新多条纪录,结果正确。

我怀疑是你遇到的问题是由于MS_SqlServer没有实现行级触发器造成的,Sql_Server
的这种缺陷已经造成了很多触发器错误了。

你可以先用跟踪器看DELPHI想数据库提交的SQL语句是什么,然后在SQL的客户端执行此语
句,来找问题。如果更新单条正确,多条错误,那么就可以确定是我上面所说的问题了。
 
沙隆巴斯的主人:你好,你是用TADOQuery编辑数据的么?
//你可以先用跟踪器看DELPHI想数据库提交的SQL语句是什么,然后在SQL的客户端执行此语
//句,来找问题。如果更新单条正确,多条错误,那么就可以确定是我上面所说的问题了。
用TADOQuery插入数据,在SQL的事件探查器中发现它向两个表插入数据了.
而直接用SQL向视图插入数据正确!

BDE中可以用TUpdateSQL自己写SQL提交数据, ADO有办法吗?

谢谢!
 
ADO有一个特点就是可以自动解析SQL语句,这在D5出来的时候是作为一个卖点的。你刚刚说的
“向两个表插入数据了”就是被它解析后的结果。

你看看能不能禁止ADO做这种智能解析。我现在手头没有DELPHI,没办法试。
 
不用DBGrid好了,用Listview自己插入数据吧.
 
谢谢沙隆巴斯的主人的回答,
看来现在的问题应该是“如何禁止ADO的智能解析SQL功能”。
 
那样写触发器也没什么意思!!维护麻烦!!!
 
后退
顶部