我有一个带有自动增量主键的表。在我的代码中,当我执行每个'insert'查询时,我试图接收新的自动增量值。有没有办法以编程方式进行呢?
感谢。
UPD: 假设我有一张桌子: TABLE User(userID INT NOT NULL AUTO_INCREMENT,name VARCHAR(25)NOT NULL,email VARCHAR(50)NOT NULL,UNIQUE(userID));
当我向此表插入新值(名称和电子邮件)时,我希望自动接收新生成的用户ID。理想情况下,我正在寻找使用单个事务和没有存储过程的任何方法。
答案 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并将其发送到服务器?如果您可以使用存储过程,这很容易做到。在存储过程中,执行插入,然后执行
对存储的proc使用输出参数(比如名为@NewPKValue)并生成最后一个语句:
设置@NewPKValue = Scope_Identity()
否则,您需要向服务器发送一批包含两个语句的命令,insert和Select Scope_Identity()并执行批处理,就好像它是一个select语句一样