2012-02-16 7 views
21

Korzystanie z C# w Visual Studio, mam wstawiania wiersza do tabeli tak:Zwracana wartość z polecenia SQL Server Insert użyciu C#

INSERT INTO foo (column_name) 
VALUES ('bar') 

chcę zrobić coś takiego, ale nie wiem poznać poprawną składnię:

INSERT INTO foo (column_name) 
VALUES ('bar') 
RETURNING foo_id 

będzie to powrót do kolumny foo_id od wstawianego rzędu.

Co więcej, nawet jeśli znajdę poprawną składnię do tego, mam inny problem: mam do dyspozycji SqlDataReader i SqlDataAdapter. O ile mi wiadomo, pierwsza służy do odczytu danych, druga do manipulowania danymi. Podczas wstawiania wiersza z instrukcją return zarówno manipuluję, jak i odczytuję dane, więc nie jestem pewien, czego użyć. Może jest coś zupełnie innego, co powinienem do tego użyć?

Odpowiedz

62

SCOPE_IDENTITY powraca do ostatniej wartości tożsamości, wprowadza się do kolumny tożsamości w tym samym zakresie. Zakres to moduł: procedura składowana, wyzwalacz, funkcja lub partia. Dlatego dwie instrukcje są w tym samym zakresie, jeśli są w tej samej procedurze, funkcji lub partii.

Można użyć SqlCommand.ExecuteScalar, aby wykonać polecenie wstawiania i pobrać nowy identyfikator w jednym zapytaniu.

using (var con = new SqlConnection(ConnectionString)) { 
    int newID; 
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)"; 
    using (var insertCommand = new SqlCommand(cmd, con)) { 
     insertCommand.Parameters.AddWithValue("@Value", "bar"); 
     con.Open(); 
     newID = (int)insertCommand.ExecuteScalar(); 
    } 
} 
+0

jaki świetny przykład Tim, bardzo mi pomógł. Dzięki za przesłanie pytania takiego jak ta Neko, dokładnie tego, czego szukałem! – WhySoSerious

+0

Zrobiłem mi błąd występujący po końcu instrukcji sql –

13

spróbuj tego:

INSERT INTO foo (column_name) 
OUTPUT INSERTED.column_name,column_name,... 
VALUES ('bar') 

WYJŚCIE może wrócić zestaw wyników (między innymi), patrz: OUTPUT Clause (Transact-SQL). Ponadto, jeśli wstawisz wiele wartości (INSERT SELECT), ta metoda zwróci jeden wiersz na wstawiony wiersz, gdzie inne metody zwrócą tylko informacje w ostatnim wierszu.

przykład praca:

declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5)) 

INSERT INTO @YourTable (YourCol1) 
OUTPUT INSERTED.YourID 
VALUES ('Bar') 

wyjściowych:

YourID 
----------- 
1 

(1 row(s) affected) 
+0

To działa. Nigdy nie wiedziałem o OUTPUT do teraz. Dzięki! – lamarant

+0

To nie działa, gdy istnieją wyzwalacze na stole. W takim przypadku pojawi się następujący błąd: 'Tabela docelowa instrukcji DML nie może mieć żadnych włączonych wyzwalaczy, jeśli instrukcja zawiera klauzulę OUTPUT bez klauzuli INTO." Nie wiem, co mają na myśli z 'bez klauzuli INTO ', ponieważ Instrukcja INSERT ma klauzulę INTO ... –

+1

@Louis Somers, tylko zwykła klauzula "WYJŚCIE" zwróci zestaw wyników. Jeśli dodasz '' INTO'', zostanie ono wstawione do tabeli. Utwórz zmienną tabeli: 'DECLARE @Temp table (xyz int, abc varchar (5))' i możesz mieć wiersze 'OUTPUT' przechodzące do tej tabeli, a następnie po' INSERT' możesz po prostu 'SELECT'' @ Tabela temperatur do zwrócenia zestawu wyników. Użyj czegoś takiego: 'OUTPUT INSERTED.col1, INSERTED.col2 INTO @ Temp' następnie po' INSERT' coś w stylu: '; SELECT * FROM @ Temp'. –

-1

Myślę, że można użyć do tego celu @@ IDENTITY, ale wydaje mi się, że są w nim jakieś specjalne zasady/ograniczenia?

using (var con = new SqlConnection("connection string")) 
{ 
    con.Open(); 
    string query = "INSERT INTO table (column) VALUES (@value)"; 

    var command = new SqlCommand(query, con); 
    command.Parameters.Add("@value", value); 
    command.ExecuteNonQuery(); 

    command.Parameters.Clear(); 
    command.CommandText = "SELECT @@IDENTITY"; 

    int identity = Convert.ToInt32(command.ExecuteScalar()); 
} 
+4

[Powinieneś naprawdę użyć 'SCOPE_IDENTITY()' i ** NOT ** '@@ IDENTITY' - która może zwrócić zaskakująco złe wyniki!] (Http: // blog. sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-insert-identity-of-record /) –

Powiązane problemy