2017-04-20 83 views
-1

TableA的ID號:如何知道新紀錄

id(auto numbering) | value 
--------------------+---------- 
1     | 100 
2     | 200 
3     | 100 
4     | 500 

在Visual Studio C#

insert into tableA (name) values (300) 

如何知道id號(自動編號)在C#中的新紀錄?

+1

https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql –

+4

'插入到表A(名稱) values(300); select scope_identity();' –

+0

我在哪裏放句子? – Omar

回答

0

試試這個:

con.Open(); 
    string sql = "INSERT INTO Table(col2) output INSERTED.id VALUES(@value)"; 
    SqlCommand cmd = new SqlCommand(sql, con); 
    cmd.Parameters.AddWithValue("@value", "300"); 

    int new_id = (int)cmd.ExecuteScalar(); // here is the new id 
-2

選項: 你可以做到這一點也查詢:

select top 1 id from yourtable order by id desc 

但是如果你需要這後面的代碼:

複製查詢到你的項目代碼。

public static int ExecuteQuery() 
     { 
      using (SqlConnection con = new SqlConnection("Your connection String here")) 
      { 
       con.Open(); 
       using (SqlCommand cmd = con.CreateCommand()) 
       { 
        cmd.CommandText = "select top 1 id from yourtable order by id desc"; 
        cmd.CommandType = CommandType.Text; 
        int result = cmd.ExecuteNonQuery(); 
        return result; 
       } 
      } 
     } 

使用:

Int id = ExecuteQuery(); 
+3

完全不是這樣,因爲它不適合併發。 – DesertFox

0

我會建議你創建一個像一個存儲過程:

SQL

CREATE PROCEDURE NameOfProcedure 
(
    @value INT = NULL, 
) 
AS 
BEGIN 
    INSERT INTO tableA 
    (
     name 
    ) 
    OUTPUT INSERTED.IDCol 
    VALUES 
    (
     @value 
    ) 
END 
GO 

C#

var cmd = new SqlCommand("NameOfProcedure", connection); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("@value", whateverValue); 

var result = (int)cmd.ExecuteScalar(); 
+0

每次創建存儲過程都是不切實際的 –

+0

您不需要該過程。無論如何,使用'output'應該工作得很好。 –

-2

一種方法是使用@@Identity財產

using (SqlConnection con = new SqlConnection("Your connection String here")) 
{ 
     con.Open(); 
     string sql = "INSERT INTO Table(col1,col2,col3) VALUES(@eimg, @etype, @flag) SELECT @@IDENTITY"; 
     SqlCommand cmd = new SqlCommand(sql, con); 
     cmd.Parameters.AddWithValue("@eimg", imgByte); 
     cmd.Parameters.AddWithValue("@etype", 4); 
     cmd.Parameters.AddWithValue("@flag", false); 
     int id = Convert.ToInt32(cmd.ExecuteScalar()); 
} 

@@identity給出當前會話並表的最後插入的行ID。

有關更多信息,請檢查此link以檢索上次插入的ID的各種方法。

+0

爲什麼這個答案downvoted? –

+0

如果你在'Table'上有一個觸發器,而這個觸發器依次插入帶有標識列'@@ identity'的另一個表中,則該值來自觸發器中的插入,而不是插入到Table中。最好使用'scope_identity()'來代替。 –

+0

但在問題中沒有提及任何觸發器。另外,我已經提供了答案中提供鏈接的提問者選擇他想要使用他自己的東西。 –