使用事务在存储过程插入记录时,第一条老是不能增加 (300分)(100分)

  • 主题发起人 主题发起人 zbsfg
  • 开始时间 开始时间
Z

zbsfg

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我在一个事务中一次插入2条以上记录时,第一条就不能插入,我在MSSQL的事件探查器
中发现第一条记录也有,就是没有插入数据库中,但如果只插一条记录却是可以的,怪怪!
如果不使用事务,多条记录却是可以全部插入的。这难道是事务的错??
代码如下,数据库是MS SQLSERVER
adospmain.Prepared:=true;
adoconnection.BeginTrans; //如果取消第一条及以下的COMMIT及ROLL却行了
for i:=0 to lbcategory.Items.Count-1 do //假如运行3次,第一次的记录在这里应该没问题
begin
adospmain.Parameters.ParamByName('@s_id').value:=i;
adospmain.Parameters.ParamByName('@category').value:=label1.Caption; //即类别名称如人员类别等
adospmain.Parameters.ParamByName('@content').value:=lbcategory.Items;
adospmain.ExecProc;
end;
adoconnection.CommitTrans; //<-----

存储过程是:
/*插入类别库记录
输入:各个字段值
输出:无
*/
CREATE PROCEDURE insertCategory @s_id smallint,@category char(10),@content char(10)
AS
insert gz_category (s_id,category,content) values(@s_id,@category,@content)
GO
很简单的,应该是没问题

大家帮忙
 
adoconnection.BeginTrans
for i:=0 to lbcategory.Items.Count-1 do
begin
adospmain.Parameters.ParamByName('@s_id').value:=i;
adospmain.Parameters.ParamByName('@category').value:=label1.Caption;
adospmain.Parameters.ParamByName('@content').value:=lbcategory.Items;
adospmain.Prepared:=true;
adospmain.ExecProc;
end;
adoconnection.CommitTrans;
 
有道理,怎么是100分?
 
什么意思?
 
还是不行,另外200分在
ID:1152748

adospmain.Parameters.ParamByName('@s_id').value:=i;
adospmain.Parameters.ParamByName('@category').value:=label1.Caption; //即类别名称如人员类别等
adospmain.Parameters.ParamByName('@content').value:=lbcategory.Items;
adospmain.Prepared:=true;
adospmain.ExecProc;
 
有一个自增量字段,我看了一下记录,发现第一条记录的ID号被跳过了
如果ID号从1开始,则数据库中的ID却是从2开始的,这说明ID=1被忽略了
2 <-这里少了1
3
5 <-这里少了4
6
问题是如果插入一条却是行的,不使用事务也成功!!!!
怪!
 
adospmain.Prepared:=false;
adospmain.Parameters.ParamByName('@s_id').value:=i;
adospmain.Parameters.ParamByName('@category').value:=label1.Caption; //即类别名称如人员类别等
adospmain.Parameters.ParamByName('@content').value:=lbcategory.Items;
adospmain.Prepared:=true;
adospmain.ExecProc;
试试看吧,:)
 
没有用,我看了一下msSQL的事件探查器,内容如下,
SET SET NO_BROWSETABLE OFF
go
exec [gz2002]..sp_procedure_params_rowset N'insertCategory', 1, NULL, NULL
go
set implicit_transactions on
go
exec [gz2002]..sp_procedure_params_rowset N'insertCategory', 1, NULL, NULL
go
declare @P1 int
set @P1=2
exec sp_prepexecrpc @P1 output, N'insertCategory', 0, '人员类别', 'a' //这是第一条
select @P1
go
SET NO_BROWSETABLE ON
go
SET FMTONLY ON exec sp_execute 2,0,0,' ',' ' SET FMTONLY OFF
go
set fmtonly off
go
exec sp_execute 2, 1, '人员类别', 'b'
go
exec sp_execute 2, 2, '人员类别', 'c'
go
IF @@TRANCOUNT > 0 COMMIT TRAN
go
 
这里看不出有什么问题:)
 
问题解决了,就是解决的有些不太明白
adospmain.Prepared:=false; //不使用PREPARED:=TRUE就可以了
adoconnection.BeginTrans;
....
多谢HIGOAL的热心帮助,我的QQ号是88147270,大家交个朋友,有空多联系.
 

Similar threads

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