Frage

Ich habe eine Abfrage eine Zeile in eine Tabelle einfügen, die ein Feld ID genannt hat, die auf der Spalte AUTO_INCREMENT bevölkert verwendet. Ich brauche diesen Wert für die nächste Bit-Funktionalität zu erhalten, aber wenn ich folgendes ausführen, es gibt immer 0, obwohl der tatsächliche Wert nicht auf 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());

Nach meinem Verständnis soll dies die ID-Spalte zurück, aber es gibt nur 0 jedes Mal. Irgendwelche Ideen?

EDIT:

Wenn ich ausführen:

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

ich:

{"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"}
War es hilfreich?

Lösung

[Edit: added "wählen Sie" vor Verweisen auf LAST_INSERT_ID ()]

Was ist mit "select last_insert_id();" nach dem Einsatz ausgeführt wird?

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

Edit: Wie duffymo erwähnt, würden Sie wirklich gut bedient werden mit parametrisierte Abfragen Beispiel .


Edit: , bis Sie auf eine parametrisierte Version wechseln, könnte man Frieden mit string.Format finden:

comm.CommandText = string.Format("{0} '{1}', {2}, {3}, {4}, {5}); select last_insert_id();",
  insertInvoice, invoiceDate.ToString(...), bookFee, adminFee, totalFee, customerID);

Andere Tipps

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

Mit LastInsertedId.

Sehen Sie meinen Vorschlag mit Beispiel hier: http://livshitz.wordpress.com/2011/10/28/returning-last-inserted-id-in-c-using-mysql-db-provider/

Es stört mich jemand zu sehen ein Date zu nehmen und sie in einer Datenbank als String speichern. Warum nicht den Spaltentyp Realität widerspiegeln?

Ich bin auch überrascht, eine SQL-Abfrage, um zu sehen ist, mit String-Verkettung aufgebaut. Ich bin ein Java-Entwickler, und ich weiß gar nicht C #, aber ich würde fragen, ob es nicht ein Bindungsmechanismus entlang der Linien von java.sql.PreparedStatement irgendwo in der Bibliothek war? Es ist für Schutz vor SQL-Injection-Angriffe empfohlen. Ein weiterer Vorteil ist möglich, Leistungsvorteile, da die SQL analysiert werden kann, überprüft, einmal zwischengespeichert und wiederverwendet werden.

Tatsächlich kehrt das Verfahren ExecuteScalar die erste Spalte der ersten Reihe des DataSet zurückgegeben wird. In Ihrem Fall sind Sie nur ein Insert tun, sind Sie eigentlich keine Daten abfragt. Sie müssen die scope_identity abfragen () nach Einsatz sind (das ist die Syntax für SQL Server) und dann werden Sie Ihre Antwort. Siehe hier:

Linkage

EDIT: Wie Michael Haren wies darauf hin, die Sie in Ihrem Tag erwähnt Sie verwenden MySQL, verwenden LAST_INSERT_ID (); statt scope_identity ();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top