2011-05-24 66 views
18
public static void CreateSocialGroup(string FBUID) 
{ 
    string query = "INSERT INTO SocialGroup (created_by_fbuid) VALUES (@FBUID); SELECT @@IDENTITY AS LastID"; 

    using (SqlConnection connection = new SqlConnection(ConnectionString)) 
    { 
     SqlCommand command = new SqlCommand(query, connection); 
     command.Parameters.AddWithValue("@FBUID", FBUID); 

     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

这是正确的方法吗?我如何得到一个变量的LastID?谢谢SQL Server和C#:得到最后插入的ID

+0

可能重复(http://stackoverflow.com/questions/ 5228780 /如何获取最后插入的ID) – 2014-08-13 08:07:52

回答

3

你可以尝试ExecuteScalar获取LastID值。

+0

工程,但我得到2行插入,为什么? – Johan 2011-05-24 11:40:52

+0

@Johan:SQL Profiler显示什么? – Richard 2011-06-27 08:51:39

-16
SqlCommand command = new SqlCommand("select max(id) from SocialGroup ", connection); 
int lastId = (int)command.ExecuteScalar(); 
+2

MAX(id)可能不是正确的方法。如其他地方所建议的SCOPE_IDENTITY()更好。 – 2011-05-24 11:36:58

+2

-1可能是我见过的最常见的问题 – gbn 2011-05-24 11:39:39

+6

-1另外。万一你不确定这个问题,一个并发事务可能会执行一个插入操作,因此你的选择返回错误的结果。 – 2011-05-24 11:56:15

10

您可以使用ExecuteScalar从Sqlcommand获取最后一个值。

scope_identity()函数比@@ identity更安全。

2

我建议使用存储过程来做到这一点。您可以给它一个OUTPUT参数,您可以使用该参数将id值返回给您的应用程序。

-3

仅对查询使用Stored Procedure,并使用SCOPE_IDENTITY来获取最大值。

+2

已经参数化。 'Parameters.AddWithValue'告诉我们这一点。 – gbn 2011-05-24 11:54:42

+0

写入查询并发送到网络可能会产生拥塞。就像OP写的“string query =”INSERT INTO SocialGroup(created_by_fbuid)VALUES(@FBUID); SELECT @@ IDENTITY AS LastID“; ”这不是一个好习惯。这应该在存储过程 – Pankaj 2011-05-24 11:57:14

+1

你有权威的参考来描述那个行为吗?存储的proc呼叫仍然通过网络发送。 – gbn 2011-05-24 12:43:26

5

就我个人而言,我会重新编写代码来使用参数。您可以使用InputOutput参数或Output参数。但是,在SQL中使用返回值也是可行的。

关于此can be found on MSDN的完整示例。

我也会使用Scope_Identity()而不是@@Identity,这样可以确保您会尊重与当前事务相关的ID。有关Scope_Identity can be found here的详情。

26

OUTPUT子句?

string query = "INSERT INTO SocialGroup (created_by_fbuid) 
       OUTPUT INSERTED.IDCol --use real column here 
       VALUES (@FBUID)"; 
... 
int lastId = (int)command.ExecuteScalar(); 
+0

工程,但我得到2行插入,为什么? – Johan 2011-05-24 11:52:41

+0

@Johan:它在某处被调用两次。给定的SQL仅插入一行。 – gbn 2011-05-24 11:55:49

+1

使用SCOPE_IDENTITY()而不是OUTPUT可能会更好,因为如果在表上设置了触发器(如[此问题链接]上所述),OUTPUT会给出错误(http://stackoverflow.com/questions/330707/如何插入记录并返回新创建的ID使用单个sqlcommand)) – marquito 2012-07-31 12:23:28

8

如果您的服务器支持OUTPUT clause你可以用这一个尝试:?如何获得最后插入的ID]的

public static void CreateSocialGroup(string FBUID) 
{ 
    string query = "INSERT INTO SocialGroup (created_by_fbuid) OUTPUT INSERTED.IDENTITYCOL VALUES (@FBUID)"; 

    using (SqlConnection connection = new SqlConnection(ConnectionString)) 
    { 
     SqlCommand command = new SqlCommand(query, connection); 
     command.Parameters.AddWithValue("@FBUID", FBUID); 

     connection.Open(); 
     var _id = command.ExecuteScalar(); 
    } 
} 
+0

INSERTED.IDENTITYCOL在SQL Azure中不起作用。但是,如果您的身份列以“ID”命名,那么INSERTED.ID可以工作! – 2012-07-07 01:58:17