繁体   English   中英

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

[英]Issue with Scope_identity() when used with TransactionScope()

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

似乎除非我提交事务,否则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]->行[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的自动增量功能。 通常,我们将自动增量列用作PK。

例如: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

为此,您需要:

  • 桌子上的钥匙
  • 密钥需要设置Identity = true
  • 该过程需要set nocount on以抑制插入结果

例:

create procedure proc_insertlot
as

set nocount on

insert into SomeTable (
  SomeField
) values (
  42
)

select scope_identity()

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

select Scope_Identity

也许这可以帮助您解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM