Obtenga la identificación de la fila insertada usando C #

Tengo una consulta para insertar una fila en una tabla, que tiene un campo llamado ID, que se rellena usando un AUTO_INCREMENT en la columna. Necesito obtener este valor para el próximo bit de funcionalidad, pero cuando ejecuto lo siguiente, siempre devuelve 0 aunque el valor real no sea 0:

MySqlCommand comm = connect.CreateCommand(); comm.CommandText = insertInvoice; comm.CommandText += "\'" + invoiceDate.ToString("yyyy:MM:dd hh:mm:ss") + "\', " + bookFee + ", " + adminFee + ", " + totalFee + ", " + customerID + ")"; int id = Convert.ToInt32(comm.ExecuteScalar()); 

De acuerdo con mi entendimiento, esto debería devolver la columna ID, pero simplemente devuelve 0 cada vez. ¿Algunas ideas?

EDITAR:

Cuando corro:

 "INSERT INTO INVOICE (INVOICE_DATE, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, CUSTOMER_ID) VALUES ('2009:01:01 10:21:12', 50, 7, 57, 2134);last_insert_id();" 

Yo obtengo:

 {"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'last_insert_id()' at line 1"} 

[Editar: se agregó “seleccionar” antes de las referencias a last_insert_id ()]

¿Qué hay de ejecutar ” select last_insert_id(); ” después de su inserción?

 MySqlCommand comm = connect.CreateCommand(); comm.CommandText = insertInvoice; comm.CommandText += "\'" + invoiceDate.ToString("yyyy:MM:dd hh:mm:ss") + "\', " + bookFee + ", " + adminFee + ", " + totalFee + ", " + customerID + ");"; + "select last_insert_id();" int id = Convert.ToInt32(comm.ExecuteScalar()); 

Editar: Como se mencionó en Duffymo, realmente estarías bien atendido usando consultas parametrizadas como esta .


Editar: Hasta que cambie a una versión parametrizada, puede encontrar paz con la cadena. Formato:

 comm.CommandText = string.Format("{0} '{1}', {2}, {3}, {4}, {5}); select last_insert_id();", insertInvoice, invoiceDate.ToString(...), bookFee, adminFee, totalFee, customerID); 
 MySqlCommand comm = connect.CreateCommand(); comm.CommandText = insertStatement; // Set the insert statement comm.ExecuteNonQuery(); // Execute the command long id = comm.LastInsertedId; // Get the ID of the inserted item 

Me molesta ver a alguien tomar una Fecha y almacenarla en una base de datos como una Cadena. ¿Por qué no hacer que el tipo de columna refleje la realidad?

También me sorprende ver que se crea una consulta SQL utilizando la concatenación de cadenas. Soy un desarrollador de Java, y no sé C # en absoluto, pero me pregunto si no hay un mecanismo vinculante a lo largo de las líneas de java.sql.PreparedStatement en algún lugar de la biblioteca? Se recomienda para proteger contra los ataques de inyección SQL. Otro beneficio son los posibles beneficios de rendimiento, ya que el SQL se puede analizar, verificar, almacenar en caché una vez y reutilizar.

En realidad, el método ExecuteScalar devuelve la primera columna de la primera fila del DataSet que se devuelve. En tu caso, solo estás haciendo un Insert, en realidad no estás consultando ningún dato. Debe consultar el scope_identity () después de insertar (esa es la syntax de SQL Server) y luego tendrá su respuesta. Mira aquí:

Enlace

EDITAR: Como Michael Haren señaló, usted mencionó en su etiqueta que está usando MySql, use last_insert_id (); en lugar de scope_identity ();