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

时间:2009-09-09 23:32:35

标签: c# .net sql auto-increment

我有一个带有自动增量主键的表。在我的代码中,当我执行每个'insert'查询时,我试图接收新的自动增量值。有没有办法以编程方式进行呢?

感谢。

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

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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;

}

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

    设置@NewPKValue = Scope_Identity()

  3. 否则,您需要向服务器发送一批包含两个语句的命令,insert和Select Scope_Identity()并执行批处理,就好像它是一个select语句一样