我正在使用TransactionScope()这样......
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_insertlot"; cmd.Connection = sqlconn;
da = new SqlDataAdapter(cmd);
for (int i = 0; i < 3 i++)
{
da.Fill(ds);//this insert a row in a table which has identity column
LotId = ds.Tables[1].Rows[0][0].ToString();//always return same identityvalue
}
// --- TransactionScope commit
似乎除非我提交事务,否则scope_identity不会增加。在此示例中,scope_identity将返回相同的值3次。你是怎么解决这个问题的?
SQL:
ALTER procedure proc_insertlot
@AuctionId int=0,
@Title varchar(300)='',
@Description varchar(4000)='',
@lottype varchar(20)='',
@ImproveBidBy varchar(20)='',
@BidDecrement varchar(20)='',
@FrontBuffer varchar(20)='',
@BackBuffer varchar(20)='',
@AttachmentId varchar(30)='',
@MkrId varchar(11)='' ,
@file_uploadlot varchar(30) =''
as
set nocount on
insert into tbl_lots(AuctionId,Title,Description,lottype,ImproveBidBy,BidDecrement,FrontBuffer,BackBuffer,AttachmentId,MkrId,MkrDt)
values (@AuctionId,@Title,@Description,@lottype,@ImproveBidBy,@BidDecrement,@FrontBuffer,@BackBuffer,@AttachmentId,@MkrId,GETDATE())
select @@Identity as lotid
答案 0 :(得分:0)
我认为它会起作用。改变行[0] [0] - &gt;行[I] [0]
for (int i = 0; i < 3 i++)
{
da.Fill(ds);//this insert a row in a table which has identity column
LotId = ds.Tables[1].Rows[i][0].ToString();//will now return required identityvalue
}
看看它是否有效。
<强>更新强>
得到了你的问题。问题是这样的
提交范围后,LotId = ds.Tables[1].Rows[0][0].ToString();
将始终返回scope_identity
的最后一个值。相反,您可以尝试@@Identity
。还要检查是否已使用PK启用了AutoIncrement。通常我们使用AutoIncrement Columns作为PK。
e.g。 Courtsey:Guffa。
create procedure proc_insertlot
as
set nocount on
declare @id as int
insert into SomeTable (
SomeField
) values (
42
)
SET @Id=@@Identity
SELECT @ID
答案 1 :(得分:0)
为此,您需要:
set nocount on
来抑制插入的结果示例:
create procedure proc_insertlot
as
set nocount on
insert into SomeTable (
SomeField
) values (
42
)
select scope_identity()
答案 2 :(得分:0)
ExecuteScalar用于最后插入记录的返回ID,您可以使用此
返回idselect Scope_Identity
这可以帮助您解决问题。