usando un campo di incremento automatico ... e voglio ottenere l'ultimo appena aggiunto ad unirsi con qualcos'altro.
La chiave qui è "appena aggiunto". Se hai un sacco di utenti diversi che colpiscono il db allo stesso tempo, non penso che tu voglia che l'utente A recuperi il record creato dall'utente B. Ciò significa che probabilmente vorrai utilizzare la funzione scope_identity()
per ottenere quell'id anziché eseguire nuovamente una query sul tavolo immediatamente.
A seconda del contesto, potrebbe anche essere necessario @@identity
(includere i trigger) o ident_current('questions')
(limitato a una tabella specifica, ma non all'ambito specifico). Ma scope_identity()
è quasi sempre quello giusto da usare.
Ecco un esempio:
DECLARE @NewOrderID int
INSERT INTO TABLE [Orders] (CustomerID) VALUES (1234)
SELECT @NewOrderID=scope_identity()
INSERT INTO TABLE [OrderLines] (OrderID, ProductID, Quantity)
SELECT @NewOrderID, ProductID, Quantity
FROM [ShoppingCart]
WHERE CustomerID=1234 AND SessionKey=4321
In base al codice che hai postato, si può fare qualcosa di simile:
// don't list the ID column: it should be an identity column that sql server will handle for you
const string QUERY = "INSERT INTO Questions (Question, Answer, CategoryID, Permission) "
+ "VALUES (@Question, @Answer, @CategoryID, @Permission);"
+ "SELECT scope_identity();";
int NewQuestionID;
using (var cmd = new SqlCommand(QUERY, conn))
{
cmd.Parameters.AddWithValue("@Question", question);
cmd.Parameters.AddWithValue("@Answer", answer);
cmd.Parameters.AddWithValue("@CategoryID", lastEdited);
cmd.Parameters.AddWithValue("@Permission", categoryID);
NewQuestionID = (int)cmd.ExecuteScalar();
}
Vedere la mia risposta ad un'altra domanda qui:
get new SQL record ID
Il problema ora è che probabilmente vorrai che le successive istruzioni sql si trovino nella stessa transazione. Si potrebbe fare questo con il codice client, ma trovo che mantenere tutto sul server sia più pulito. È possibile farlo creando una stringa sql molto lunga, ma a questo punto preferisco una stored procedure.
Non sono un fan del metodo .AddWithValue()
— Preferisco definire esplicitamente i tipi di parametro — ma possiamo lasciarlo per un altro giorno.
Infine, è un po 'tardi ora, ma voglio sottolineare che è davvero meglio provare a mantenere tutto questo sul db. È possibile eseguire più istruzioni in un comando sql e si desidera ridurre il numero di round trip necessari al db e la quantità di dati necessari per passare avanti e indietro tra il db e l'app. Rende anche più facile ottenere le transazioni giuste e mantenere le cose atomiche dove devono essere.
+1 per menzionare scope_identity() è quasi sempre quello giusto da usare. – RichardOD
ho sorpreso nessuno menzionato identity_current, ho postato alcuni collegamenti ed esempi –
ma l'identità dell'ambito mi riporta indietro una colonna di valori nulli voglio l'ultimo non il conteggio? appena aggiunto: le precedenti linee di codici sono stati quelli che hanno aggiunto questo nuova riga –