2013-08-22 194 views
60

您好我正在MVC4中使用C#插入一些值到SQL表。其實我想插入值並返回最後插入記錄的'ID'。我使用下面的代碼。執行插入命令並返回在Sql中插入的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()(不與我的代碼一起工作)。

+0

「InsertedID」是什麼意思? –

+0

你可以看看http://stackoverflow.com/questions/9319532/return-value-from-sql-server-insert-command-using-c-sharp – Linky

回答

107

以下解決方案將獲得與SQL Server 2005及以上的工作。您可以使用output獲取必填字段。在id的位置你可以寫你想要返回的密鑰。像這樣做

對於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; 
    } 
} 
+1

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

+7

請注意,列名稱必須與表格的標識列名稱相匹配。例如,具有此標識列名稱的表:'select EmployeeId,* from Employees'在插入語句中需要以下片段:'output inserted.EmployeeId' – joshjeppson

+0

如何在此情況下檢查查詢是否確實插入了? – ATD

24

更改查詢

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

這將返回最後插入的ID,你可以接着用ExecuteScalar

+1

這顯示一個錯誤「InValidCast異常是由用戶未處理代碼「 – neel

+1

@neel,這是因爲scope_identity()返回的數值數據類型只能針對十進制.net數據類型進行轉換。另一種方法是使用Convert.To ()系列函數來避免投射問題。 – Harsh

+1

此答案更好,因爲您不必輸入要插入的表的ID列。 – goamn

0
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.*/ 
1
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:Retur ns插入到同一範圍內的標識列中的最後一個標識值。有關詳細信息存儲http://technet.microsoft.com/en-us/library/ms190315.aspx

+1

會很好,但ExecuteNonQuery只返回受影響的行數,而不是ID。改爲使用ExecuteScalar https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query %3FappId%3DDev15IDEF1%26升%3DEN-US%26K%3DK(System.Data.SqlClient.SqlCommand.ExecuteNonQuery); K(SolutionItemsProject); K(TargetFrameworkMoniker-.NETFramework,版本%3Dv4.6.2); K(DevLang-CSHARP )%26rd%3Dtrue&視圖= netframework-4.7.1 – Brandtware

9

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; 
     } 
    } 
}