2011-12-04 61 views
8

Tengo la siguiente función que ejecuta una consulta y devuelve verdadero en caso de éxito y falso en caso de error. No, quería extender el método para que con cada consulta de inserción que se active, la clase var insertId contenga el ID de la última fila insertada.C# + SQL Server ExecuteScalar() no devuelve el último ID insertado

El problema es que insertId es siempre 0, por lo que de alguna manera el executeScalar() no devuelve la ID.

¿Alguna idea? U otras soluciones para obtener el identificador de la última consulta de inserción ....

public int insertId;   

    public bool executeCommand(string q) { 
     q += "; SELECT @@IDENTITY AS LastID"; 
     bool retour = true; 
     SqlConnection myCon = new SqlConnection(Settings.DSN); 
     SqlCommand cmd = new SqlCommand(q, myCon); 
     try { 
      cmd.Connection.Open(); 
      insertId = (int)cmd.ExecuteScalar(); 
      if (insertId > 0) { 
       MessageBox.Show(insertId.ToString()); 
      } 

      myCon.Close(); 
     } catch (Exception ex) { 
      this.error = ex.Message; 
      retour = false; 
     } 
     return retour; 
    } 

Respuesta

17

Debe cambiar su INSERT para devolverle la ID insertada de inmediato (en una cláusula OUTPUT). Esto funciona desde SQL Server 2005 en - la cláusula OUTPUT no está disponible en SQL Server 2000 o anterior (no especificó qué versión de SQL Server está utilizando en su pregunta ...). Lea más acerca de OUTPUT clause on MSDN Books Online.

Cambiar la inserción a ser algo así como:

INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN) 
OUTPUT Inserted.ID 
VALUES(Val1, Val2, ..., ValN); 

y luego al ejecutar su sentencia de inserción desde C#, debe ser capaz de hacer:

using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon)) 
{ 
    myCon.Open(); 
    var result = cmdInsert.ExecuteScalar(); 
    myCon.Close(); 
} 

y la variable de result Ahora debería ¡contiene el valor correcto recién insertado!

+1

Estoy usando la versión de 2005 ... Voy a intentar esto, pero va a ser un trabajo porque todas las consultas de inserción ya están escritas ... EDITAR: ¡Gracias! Esto funcionó, el resultado ahora contiene la identificación de la fila insertada – jhoevenaars

+0

Muchas gracias. Pero recuerde que Inserted.ID significa Inserted.name of ID column :) –

+0

Muchas gracias, funciona de maravilla: D – cheloncio

2

SCOPE_IDENTITY Try() en lugar de @@ IDENTITY, si eso no funciona, puede publicar el esquema de tabla y el inserto de consulta que estan corriendo.

Cuestiones relacionadas