2012-04-18 10 views
5

Tengo un código como el siguiente donde intento insertar datos en una tabla y devolver la ID (dada por incremento automático) del nuevo elemento.ExecuteScalar() devuelve nulo aunque se agregaron datos a DB

int newEquipmentID = new int(); 

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

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

Pero falla y devuelve un valor nulo, como si el nuevo elemento no se ha agregado aún. Pero en realidad puedo ver el nuevo artículo haciendo una simple consulta en el DB.

Mi pregunta es "cuando" los datos realmente se agregan a la base de datos y cómo puedo obtener la identificación del nuevo elemento agregado. Gracias!

Respuesta

11

No necesita dos consultas para crear el nuevo disco y recuperar el nuevo valor de identidad:

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 al margen: no utilizaría una clase de base de datos desde it's prone to errors.

2

Para regresar el id de la fila acaba de insertar es necesario seleccionar, porque ExecuteScalar() vuelve

la primera columna de la primera fila del conjunto de resultados devuelto por la consulta

y INSERT no selecciona/devuelve nada

insert ... 
select ... 

Consulte la respuesta de @ Tim para obtener más detalles.

+0

por supuesto ... es por eso que estoy usando ExecuteScalar() –

+0

ExecuteScalar() devuelve el primer campo de un elemento (la línea izquierda elemento de columna superior) –

+0

@abatischchev, así que ... Pero –

1

Su consulta SQL no devuelve el Id generado recientemente. Para devolverlo, utilizar un OUTPUT clause:

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

Algunas cosas que tener cuidado con:

  • <list of fields> representa una lista separada por comas de columnas para el que va a proporcionar valores
  • la lista de campos no debe incluir la columna de ID de incremento automático (a la que se le asignará automáticamente un valor)
  • <list of values> representa una lista de valores separados por comas t sombrero se insertará en los campos especificados anteriormente. El número de valores debe ser igual al número de campos y los tipos de datos deben coincidir
0

La cláusula OUTPUT le ayudará a obtener el ID del nuevo artículo agregado. Para obtener más información, consulte el siguiente enlace:

Haga clic here! para más detalles

Cuestiones relacionadas