不难---给出一个触发器的完整例子,up有分。 (200分)

  • 主题发起人 主题发起人 ldaan3
  • 开始时间 开始时间
L

ldaan3

Unregistered / Unconfirmed
GUEST, unregistred user!
ado+access,用adoquery连接adoconnection。(数据量约为1万条)
有一个字段(序号)是连续的,当我插入一条记录,后面的序号都要自动加一。
例如表如下:(adoconnection1、adoquery1、datasource1、dbgrid)
序号 姓名 年龄
1 小明 20
2 小东 30
3 小红 28
4 小放 34
5 小华 42
在 3 后插入一条记录,然后4、5就自动加一,变为:5、6。
详见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1333518

在这里我想用 触发器 来实现,触发器语句我可以看明白,但是我却不知道这些语句是写在什么
地方的, 而且用触发器可不可以实现,因为是access。

请给出一个完整例子。 而不是单单一个触发器语句。
分不够可以再加。
 
Access中无法实现触发器,它支持过程
你必须在客户端程序中实现
因为:
序号字段设置为整数
在插入数据前取得下一条纪录的序号值
更新所有序号值>=索取的序号值的纪录的序号+1
新插入序号为当前索取的序号值
 
ACCESS没有触发器
如果是MSSQL
CREATE TRIGGER 触发器名
ON 表名
FOR INSERT
AS
BEGin
update xx set xx=xx+1 where ....
EIN
END
4
 
靠,你想把电脑折腾死。
一定要就取记录号嘛,何必这样。
 
还是另加个字段,自动增加的。
stuwei, 时间:2002-9-23 8:03:00, ID:1340180
说的也可。
 
既然Access不支持Trigger,那么触发器肯定没有用了
不知道Access支持不支持自动增加的字段,如果不支持,肯定自动字段也没有用了
只好使用查询的方法了
 
那不管,解决我的插入时,后面的序号自动这个问题就有分。
要在button1 的onclick 事件中实现。
 
create triger Triger_Name
on Table_Name
for insert
as
begin
update order set order = order + 1 where <条件>
end
end


 
那不管,解决我的插入时,后面的序号自动这个问题就有分。
要在button1 的onclick 事件中实现。

ado+access中。
 
可以用Parameters 的方法,不过要给code。

我是这样写的,不过不行:
procedure TForm1.Button5Click(Sender: TObject);
var
j:integer;
begin
j:=0;
j:=adoquery1.Fields[0].AsInteger;

adoquery1.Insert;

adoquery1.Fields[0].AsInteger:=j;
adoquery1.Fields[1].AsString:=edit3.Text;
adoquery1.Fields[2].AsInteger:=strtoint(edit4.text);

adoquery1.Close;
adoquery1.SQL.Clear;

adoquery1.SQL.Add('update 111 set 序号=序号+1 where 序号>bb');
adoquery1.Parameters.ParamByName('bb').value:=j;
adoquery1.ExecSQL;

adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from 111 order by 序号');
adoquery1.Active:=true;
end;
 
不建议用错发器的,这样程序移植性不好,
如果是SQL Server错发器不是很简单的,就在要建错发器的表设计时建就行了。
具体试试例子。
不建议用错发器的另外一个原因是错发器用的不是标准的SQL,而且跟本身对
表的操作的SQL语句都不一样。
 
请大家帮我修改一下,为什么这样插入,后面的序号不能自动加一呢?

procedure TForm1.Button5Click(Sender: TObject);
var
j:integer;
begin
j:=0;
j:=adoquery1.Fields[0].AsInteger;

adoquery1.Insert;

adoquery1.Fields[0].AsInteger:=j;
adoquery1.Fields[1].AsString:=edit3.Text;
adoquery1.Fields[2].AsInteger:=strtoint(edit4.text);

adoquery1.Close;
adoquery1.SQL.Clear;

adoquery1.SQL.Add('update 111 set 序号=序号+1 where 序号>bb');
adoquery1.Parameters.ParamByName('bb').value:=j;
adoquery1.ExecSQL;

adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from 111 order by 序号');
adoquery1.Active:=true;
end;
 
这位兄弟:
你的要求很特殊!但你所有上面的代码可以用一条语句代替:
procedure TForm1.Button5Click(Sender: TObject);
begin
adoquery1.sql.clear;
adoquery1.sql.add('insert into 111 (序号) select max(序号)+1 from 111 ');
adoquery1.execsql;
end;
应该不难理解吧!
在SQL_SERVER及ACCESS下都没问题!
 
to:luckywzy

好象不行哦,提示说‘索引或主见不能为null值’。
 
我觉得还是用update 吧!这样很不错,用触发器要方便一点!
 
不是说access 不支持触发器吗?
 
TO LDAAN3:
你应该把111表的主键设为[序号]
或把表的索引去掉就可以了!

如是还不行,你把111这张表发给我看一下!(留几条数据在里面)
MY_MAIL:LUCKY_WZY@YAHOO.COM.CN
 
后退
顶部