【问题标题】:C#/SQL get autoincremented field valueC#/SQL 获取自动递增的字段值
【发布时间】:2010-11-27 00:34:56
【问题描述】:

我有一个带有自动递增主键的表。在我的代码中,我试图在执行每个“插入”查询时接收新的自动增量值。有没有办法以编程方式做到这一点?

谢谢。

更新: 假设我有一张桌子: TABLE 用户(userID INT NOT NULL AUTO_INCREMENT,姓名 VARCHAR(25) NOT NULL,电子邮件 VARCHAR(50) NOT NULL,UNIQUE (userID));

当我向该表插入新值(姓名和电子邮件)时,我希望自动接收新生成的用户 ID。理想情况下,我正在寻找使用单个事务且无需存储过程的任何方法。

【问题讨论】:

  • 能否请您展示一些您当前正在做的示例代码?

标签: c# .net sql auto-increment


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在存储过程中是:

    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
    

    在您拥有的 C# 代码中:

    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】:

      根据您的情况,您最好使用table-valued parameters 将插入传递给存储过程,然后使用OUTPUT INSERTED 从存储过程中返回表值参数。

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

      【讨论】:

      • +1 用于提及 OUTPUT - 似乎没有人知道并使用它!
      【解决方案4】:

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

      1. 选择 Scope_Identity() 作为存储过程中的最后一条语句,或者
      2. 使用存储过程的输出参数(比如名为@NewPKValue)并做出最后一条语句:

        设置@NewPKValue = Scope_Identity()

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • BAD BAD BAD - 使用 scope_identity() 获得更好(更准确)的结果!
        猜你喜欢
        • 1970-01-01
        • 2015-11-03
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 2011-03-04
        相关资源
        最近更新 更多