2

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

谢谢。

UPD:假设我有一张表:TABLE User (userID INT NOT NULL AUTO_INCREMENT, name VARCHAR(25) NOT NULL, email VARCHAR(50) NOT NULL, UNIQUE (userID));

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

4

5 回答 5

4

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

于 2009-09-09T23:38:08.940 回答
4

在存储过程中是:

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;

}
于 2009-09-09T23:40:32.460 回答
3

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

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

于 2009-09-09T23:43:37.693 回答
1

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

于 2009-09-09T23:38:21.090 回答
1

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

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

    设置@NewPKValue = Scope_Identity()

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

于 2009-09-09T23:40:53.630 回答