2012-04-18 21 views
5

Ho un codice come muggito dove cerco di inserire un dato in una tabella e restituisco l'ID (dato dall'aumento automatico) del nuovo elemento.ExecuteScalar() restituisce null anche se i dati sono stati aggiunti al DB

int newEquipmentID = new int(); 

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

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

Ma non riesce e restituisce un valore nullo, come se il nuovo elemento non è stato ancora aggiunto. Ma in realtà posso vedere il nuovo oggetto fare una semplice consultazione al DB.

La mia domanda è "quando" i dati vengono effettivamente aggiunti nel DB e come posso ottenere l'ID del nuovo elemento aggiunto. Grazie!

risposta

11

Non è necessario due query per creare il nuovo record e recuperare il nuovo valore di identità:

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

Nota a margine: non utilizzerei una tale classe di database dal it's prone to errors.

2

Per restituire l'ID di riga appena inserito è necessario selezionarlo, perché ExecuteScalar() rendimenti

la prima colonna della prima riga del set di risultati restituito dalla query

e INSERT non seleziona/restituisce nulla.

insert ... 
select ... 

Vedere la risposta di Tim per ulteriori dettagli.

+0

naturalmente ... è per questo che sto usando ExecuteScalar() –

+0

ExecuteScalar() restituisce il primo campo di un elemento (la riga superiore elemento colonna di sinistra) –

+0

@abatischchev, quindi ... Ma io –

1

La query SQL non restituisce l'ID appena generato. Per tornare, utilizzare un OUTPUT clause:

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

Alcune cose da stare attenti a:

  • <list of fields> rappresenta un elenco separato da virgole di colonne per il quale vi fornirà valori
  • l'elenco dei campi non deve includere la colonna ID di incremento automatico (a cui verrà automaticamente assegnato un valore)
  • <list of values> rappresenta un elenco di valori separati da virgole t cappello sarà inserito nei campi sopra specificati. Il numero di valori deve essere uguale al numero di campi e tipi di dati deve corrispondere
0

La clausola OUTPUT consente di ottenere l'ID del nuovo elemento aggiunto. Per ulteriori informazioni, vedere il collegamento seguente:

Fare clic su here! per maggiori dettagli

Problemi correlati