2012-04-18 9 views
5

Mam kod jak poniżej, w którym próbuję wstawić dane do tabeli i zwrócę identyfikator (podany przez auto increment) nowego elementu.ExecuteScalar() zwraca null, ale dane zostały dodane do DB

int newEquipmentID = new int(); 

query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID"); 

newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID); 

Ale zawiedzie i zwraca wartość null, tak jakby nowy element nie został jeszcze dodany. Ale tak naprawdę widzę nowy przedmiot, robiący proste konsultacje w DB.

Moje pytanie brzmi: "kiedy" dane są faktycznie dodawane do bazy danych i jak mogę uzyskać identyfikator nowego dodanego elementu. Dzięki!

Odpowiedz

11

Nie trzeba dwa zapytania, aby utworzyć nowy rekord i pobrać nową wartość Tożsamość:

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

Side-Note: Nie używałbym takiej klasy bazy danych od it's prone to errors.

2

Aby powrócić identyfikator właśnie wstawionego wiersza trzeba go wybrać, bo ExecuteScalar() powraca

pierwszej kolumnie pierwszego wiersza w zestawie wyników zwracanych przez zapytania

i INSERT nie wybiera/zwraca niczego.

insert ... 
select ... 

Zobacz odpowiedź @ Tima, aby uzyskać więcej informacji.

+0

oczywiście ... dlatego używam ExecuteScalar() –

+0

ExecuteScalar() zwraca pierwsze pole elementu (górna linia lewo elementu kolumna) –

+0

@abatischchev, więc ... –

1

Twoje zapytanie SQL nie zwraca nowo wygenerowanego identyfikatora. Aby powrócić go, użyj OUTPUT clause:

INSERT INTO Equipment (<list of fields>) 
    OUTPUT inserted.EquipmentTypeID 
VALUES (<list of values>) 

Niektóre rzeczy uważać:

  • <list of fields> reprezentuje oddzielonych przecinkami listę kolumn, które będą dostarczać wartościami
  • liście pól nie powinno być zawierać kolumnę ID automatycznej inkrementacji (która będzie automatycznie przypisywać wartość)
  • <list of values> reprezentuje rozdzielaną przecinkami listę wartości t W powyższych polach zostanie wstawiona czapka. Liczba wartości powinna być równa liczbie pól i typów danych muszą być zgodne
0

KOD OUTPUT pomoże ci uzyskać identyfikator nowego dodanego przedmiotu. Aby uzyskać więcej informacji, zobacz poniższy link:

Kliknij here! Więcej szczegółów

Powiązane problemy