执行插入命令并在Sql中返回插入的Id

您好,我在MVC4中使用C#插入一些值到SQL表。 其实我想插入值,并返回最后插入logging的“ID”。 我使用下面的代码。

public class MemberBasicData { public int Id { get; set; } public string Mem_NA { get; set; } public string Mem_Occ { get; set; } } 

插入时,ID在数据库中自动增加。

 public int CreateNewMember(string Mem_NA, string Mem_Occ ) { using (SqlConnection con=new SqlConnection(Config.ConnectionString)) { using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ)",con)) { cmd.Parameters.AddWithValue("@na", Mem_NA); cmd.Parameters.AddWithValue("@occ", Mem_Occ); con.Open(); int modified = cmd.ExecuteNonQuery(); if (con.State == System.Data.ConnectionState.Open) con.Close(); return modified; } } } 

我知道ExecuteNonQuery表示影响行的数字。 而不是我使用的

 int modified = (int)cmd.ExecuteScalar(); 

但不工作。 请帮我解决这个问题。 有没有像cmd.ExecuteInsertAndGetID()(不处理我的代码)的代码。

以下解决scheme将与SQL Server 2005及更高版本一起使用。 您可以使用输出获取必需的字段。 您可以编写您想要返回的密钥。 像这样做

FOR SQL SERVER 2005及更高版本

  using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.ID VALUES(@na,@occ)",con)) { cmd.Parameters.AddWithValue("@na", Mem_NA); cmd.Parameters.AddWithValue("@occ", Mem_Occ); con.Open(); int modified =(int)cmd.ExecuteScalar(); if (con.State == System.Data.ConnectionState.Open) con.Close(); return modified; } } 

对于以前的版本

  using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con)) { cmd.Parameters.AddWithValue("@na", Mem_NA); cmd.Parameters.AddWithValue("@occ", Mem_Occ); con.Open(); int modified = cmd.ExecuteScalar(); if (con.State == System.Data.ConnectionState.Open) con.Close(); return modified; } } 

将查询更改为

 "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ); SELECT SCOPE_IDENTITY()" 

这将返回最后插入的ID,然后您可以使用ExecuteScalar获得

SQL Server存储过程:

 CREATE PROCEDURE [dbo].[INS_MEM_BASIC] @na varchar(50), @occ varchar(50), @New_MEM_BASIC_ID int OUTPUT AS BEGIN SET NOCOUNT ON; INSERT INTO Mem_Basic VALUES (@na, @occ) SELECT @New_MEM_BASIC_ID = SCOPE_IDENTITY() END 

C#代码:

 public int CreateNewMember(string Mem_NA, string Mem_Occ ) { // values 0 --> -99 are SQL reserved. int new_MEM_BASIC_ID = -1971; SqlConnection SQLconn = new SqlConnection(Config.ConnectionString); SqlCommand cmd = new SqlCommand("INS_MEM_BASIC", SQLconn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter outPutVal = new SqlParameter("@New_MEM_BASIC_ID", SqlDbType.Int); outPutVal.Direction = ParameterDirection.Output; cmd.Parameters.Add(outPutVal); cmd.Parameters.Add("@na", SqlDbType.Int).Value = Mem_NA; cmd.Parameters.Add("@occ", SqlDbType.Int).Value = Mem_Occ; SQLconn.Open(); cmd.ExecuteNonQuery(); SQLconn.Close(); if (outPutVal.Value != DBNull.Value) new_MEM_BASIC_ID = Convert.ToInt32(outPutVal.Value); return new_MEM_BASIC_ID; } 

我希望这些对你有帮助….

你也可以使用这个,如果你想…

 public int CreateNewMember(string Mem_NA, string Mem_Occ ) { using (SqlConnection con=new SqlConnection(Config.ConnectionString)) { int newID; var cmd = "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ);SELECT CAST(scope_identity() AS int)"; using(SqlCommand cmd=new SqlCommand(cmd, con)) { cmd.Parameters.AddWithValue("@na", Mem_NA); cmd.Parameters.AddWithValue("@occ", Mem_Occ); con.Open(); newID = (int)insertCommand.ExecuteScalar(); if (con.State == System.Data.ConnectionState.Open) con.Close(); return newID; } } } 
 using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) " + "VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con)) { cmd.Parameters.AddWithValue("@na", Mem_NA); cmd.Parameters.AddWithValue("@occ", Mem_Occ); con.Open(); int modified = cmd.ExecuteNonQuery(); if (con.State == System.Data.ConnectionState.Open) con.Close(); return modified; } 

SCOPE_IDENTITY :返回插入同一范围内的标识列中的最后一个标识值。 欲了解更多详情http://technet.microsoft.com/en-us/library/ms190315.aspx

 USE AdventureWorks2012; GO IF OBJECT_ID(N't6', N'U') IS NOT NULL DROP TABLE t6; GO IF OBJECT_ID(N't7', N'U') IS NOT NULL DROP TABLE t7; GO CREATE TABLE t6(id int IDENTITY); CREATE TABLE t7(id int IDENTITY(100,1)); GO CREATE TRIGGER t6ins ON t6 FOR INSERT AS BEGIN INSERT t7 DEFAULT VALUES END; GO --End of trigger definition SELECT id FROM t6; --IDs empty. SELECT id FROM t7; --ID is empty. --Do the following in Session 1 INSERT t6 DEFAULT VALUES; SELECT @@IDENTITY; /*Returns the value 100. This was inserted by the trigger.*/ SELECT SCOPE_IDENTITY(); /* Returns the value 1. This was inserted by the INSERT statement two statements before this query.*/ SELECT IDENT_CURRENT('t7'); /* Returns value inserted into t7, that is in the trigger.*/ SELECT IDENT_CURRENT('t6'); /* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/ -- Do the following in Session 2. SELECT @@IDENTITY; /* Returns NULL because there has been no INSERT action up to this point in this session.*/ SELECT SCOPE_IDENTITY(); /* Returns NULL because there has been no INSERT action up to this point in this scope in this session.*/ SELECT IDENT_CURRENT('t7'); /* Returns the last value inserted into t7.*/