代码之家  ›  专栏  ›  技术社区  ›  Maksim Vi.

C#/SQL获取自动递增的字段值

  •  2
  • Maksim Vi.  · 技术社区  · 17 年前

    我有一个主键自动递增的表。在我的代码中,我试图在执行每个“插入”查询时接收新的自动递增值。有没有一种方法可以通过编程实现?

    谢谢

    假设我有一张桌子:

    当我向这个表插入新值(名称和电子邮件)时,我希望自动接收新生成的userID。理想情况下,我正在寻找通过单个事务而不使用存储过程来实现这一点的任何方法。

    5 回复  |  直到 17 年前
        1
  •  4
  •   Perpetualcoder    17 年前

    让您的sql/存储过程返回 scope_identity() 或者,如果您使用的是Linq2SQL或EF,则用于插入的实体将获得新id。

        2
  •  4
  •   JBrooks    17 年前

    在存储过程中,它是:

    ALTER    proc [dbo].[SaveBuild](
    @ID int = 0 output,
    @Name varchar(150)=null,
    @StageID int,
    @Status char(1)=null
    )
    as
     SET NOCOUNT ON
    
    
        Insert into Builds
        (name, StageID, status)
        values (@Name, @StageID, @Status)
    
        select @ID = scope_identity()
    
    RETURN @ID
    

    public int SaveBuild(ref int id, ref string Name)
    {
    
        SqlCommand cmd = GetNewCmd("dbo.SaveBuild");
    
        cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
        cmd.Parameters["@ID"].Direction = ParameterDirection.InputOutput;
    
        cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name;
        cmd.Parameters.Add("@StageID", SqlDbType.Int).Value = 0;
    
        ExecuteNonQuery(cmd);
        id = (int)cmd.Parameters["@ID"].Value;
    
        return id;
    
    }
    
        3
  •  3
  •   Community Mohan Dere    9 年前

    根据您的情况,您最好使用 table-valued parameters 要将插入内容传递到存储过程,请使用 OUTPUT INSERTED

    如果您处理多个项目,它将大大减少所需的点击次数。

        4
  •  1
  •   Charles Bretana    17 年前

    您是否仅限于在客户机上构建SQL并将其发送到服务器?因为如果您可以使用存储过程,这很容易做到。在存储过程中,执行插入,然后

    1. 选择Scope_Identity()作为存储过程中的最后一条语句,或
    2. Set@NewPKValue=Scope\u Identity()

    否则,您需要向服务器发送一批命令,其中包括两条语句:insert和Select Scope_Identity(),并像执行Select语句一样执行该批命令

        5
  •  1
  •   Tomas Aschan    17 年前

    您可以使用SQL语句 SELECT scope_identity() .

    推荐文章