与TransactionScope()一起使用时出现Scope_identity()问题

时间:2015-08-13 07:39:54

标签: c# sql asp.net .net sql-server

我正在使用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

3 个答案:

答案 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)

为此,您需要:

  • 表中的一个键
  • 密钥需要设置Identity = true
  • 该过程需要set nocount on来抑制插入的结果

示例:

create procedure proc_insertlot
as

set nocount on

insert into SomeTable (
  SomeField
) values (
  42
)

select scope_identity()

答案 2 :(得分:0)

ExecuteScalar用于最后插入记录的返回ID,您可以使用此

返回id
select Scope_Identity

这可以帮助您解决问题。