2011-05-24 12 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(); 
    } 
} 

¿Es esta la manera correcta de hacerlo? ¿Y cómo obtengo el último ID en una variable? GraciasSQL Server y C#: obtener la última identificación insertada

+0

posible duplicado de (http://stackoverflow.com/questions/ 5228780/how-to-get-last-inserted-id) –

Respuesta

3

U puede probar ExecuteScalar para obtener el valor de LastID.

+0

Funciona, pero tengo 2 filas insertadas, ¿por qué? – Johan

+0

@Johan: ¿Qué muestra SQL Profiler? – Richard

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

MAX (id) probablemente no sea el correcto. SCOPE_IDENTITY() como se sugiere en otro lugar es mejor. –

+2

-1 por posiblemente la peor respuesta que he visto a esta pregunta común – gbn

+6

-1 También. En caso de que no esté seguro del problema, una transacción simultánea podría realizar una inserción y, por lo tanto, su selección arrojará el resultado incorrecto. –

10

Puede utilizar ExecuteScalar para obtener el último valor de un Sqlcommand.

La función scope_identity() es más segura que @@ identity.

2

Recomendaría utilizar un procedimiento almacenado para hacer esto. Puede darle un parámetro OUTPUT que puede usar para devolver el valor del id a su aplicación.

-3

Utilice Stored Procedure solo para las consultas y use SCOPE_IDENTITY para obtener el valor máximo.

+2

Esto ya está parametrizado. El 'Parameters.AddWithValue' nos dice esto. – gbn

+0

Al escribir las consultas y enviarlas a la red puede generar congestión. Like OP escribió "string query =" INSERT INTO SocialGroup (created_by_fbuid) VALUES (@FBUID); SELECCIONE @@ IDENTIDAD COMO LastID "; " Esta no es una buena práctica. Esto debería estar en el procedimiento almacenado – Pankaj

+1

¿tiene una referencia autorizada para describir ese comportamiento? También se envía una llamada de proceso almacenada a través de la red. – gbn

5

Personalmente, volvería a escribir el código para usar Parámetros. Puede usar un parámetro InputOutput o un parámetro Output. Sin embargo, usar un valor de retorno en su SQL también funcionaría.

Ejemplos completos en este can be found on MSDN.

También usaría Scope_Identity() en lugar de @@Identity, esto asegurará que revele la identificación que se relaciona con la transacción actual. Detalles sobre Scope_Identity can be found here.

26

cláusula OUTPUT?

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

Funciona, pero tengo 2 filas insertadas, ¿por qué? – Johan

+0

@Johan: se llama dos veces en algún lugar. El SQL dado inserta una sola fila. – gbn

+1

podría ser mejor usar SCOPE_IDENTITY() en lugar de OUTPUT, ya que OUTPUT le dará errores en caso de que tenga triggers establecidos en la tabla (como se indica en [este enlace de pregunta] (http://stackoverflow.com/questions/330707/ how-to-insert-a-record-and-return-the-newly-created-id-using-a-single-sqlcommand)) – marquito

8

Si su servidor soporta el OUTPUT clause que podría intentarlo con éste: [? Id Cómo obtener la última insertada]

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 no funciona en SQL Azure.Sin embargo, si su columna de identidad se llama, por ejemplo, 'ID', INSERTED.ID funciona. –

Cuestiones relacionadas