2011-12-04 15 views
8

Ho la seguente funzione che esegue una query e restituisce true in caso di successo e falso in caso di errore. No, volevo estendere il metodo in modo che con ogni query inserita che viene attivata, la classe var insertId contenga l'ID dell'ultima riga inserita.C# + SQL Server ExecuteScalar() non restituisce l'ultimo ID inserito

Il problema è che insertId è sempre 0, quindi in qualche modo lo executeScalar() non restituisce l'ID.

Qualche idea? O altre soluzioni per ottenere l'ID dell'ultimo query di inserimento ....

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

risposta

17

È necessario modificare INSERT per restituire l'ID inserito immediatamente (in una clausola OUTPUT)! Funziona da SQL Server 2005 in poi: la clausola OUTPUT non è disponibile in SQL Server 2000 o versioni precedenti (non hai specificato quale versione di di SQL Server stai utilizzando nella domanda ...). Maggiori informazioni su OUTPUT clause on MSDN Books Online.

Cambia vostro inserto essere qualcosa di simile:

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

e poi, quando si esegue la sua dichiarazione inserto da C#, si dovrebbe essere in grado di fare:

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

e la variabile result dovrebbe ora contenere il valore corretto e appena inserito!

+1

Sto usando la versione 2005 ... Ho intenzione di provare questo, ma sarà un po 'di lavoro perché tutte le query di inserimento sono già scritte ... EDIT: Grazie! Questo ha funzionato, il risultato ora contiene l'id della riga inserita – jhoevenaars

+0

Grazie mille. Ma ricorda che Inserted.ID significa colonna Inserted.name of ID :) –

+0

Muchas gracias, funciona de maravilla: D – cheloncio

2

Try SCOPE_IDENTITY() al posto di @@ IDENTITY, se questo non funziona puoi pubblicare lo schema della tabella e la query di inserimento si stanno correndo.

Problemi correlati