如何使用单个SqlCommand插入记录并返回新创建的ID?

Mat*_*ats 48 c# sql sql-server

我正在使用SqlCommand对象将记录插入到具有自动生成主键的表中.当我使用ExecuteScalar()方法时,如何编写命令文本以便获取新创建的ID?

Dav*_*kle 74

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)

不要忘记每个语句末尾的分号.

  • 不,你不能.如果您的表上有触发器,您将收到此错误:如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表"Site"不能具有任何已启用的触发器. (8认同)
  • 您可以使用输出子句 - 插入INSERT INTO YourTable(val1,val2,val3 ...)输出而不是使用scope_identity(),$ identity VALUES(@ val1,@ val2,@ val3 ...); (3认同)

And*_*age 25

将以下行添加到Sql Query的末尾...

SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

然后在SqlCommand对象上使用ExecuteScalar方法......

var rowCount = command.ExecuteScalar()
Run Code Online (Sandbox Code Playgroud)


Jos*_*rke 16

insert into Yourtable()  
values()  
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

我刚刚运行了测试,并使用SQL Server 2005 SP2和.Net 3.5验证了分号是可选的


Mat*_*att 5

将输出参数添加到命令对象,然后将值设置为存储过程中的新ID.

存储过程:

@ID AS INT OUTPUT

[Insert Command]

SET @ID = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

.净:

cmd.CommandText = "stored_procedure";

SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);

pID.Direction = ParameterDirection.Output;

cmd.ExecuteScalar();

int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
Run Code Online (Sandbox Code Playgroud)