[Редактирование: добавленный "выбор" перед ссылками на last_insert_id ()]
Что относительно того, чтобы работать" select last_insert_id();
" за Вашей вставкой?
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());
<час> Редактирование: Как duffymo упомянутый, Вы действительно были бы хорошо обслужены с помощью параметризированных запросов как это .
<час>Редактирование: , Пока Вы не переключаетесь на параметризованную версию, Вы могли бы найти мир со строкой. Формат:
comm.CommandText = string.Format("{0} '{1}', {2}, {3}, {4}, {5}); select last_insert_id();",
insertInvoice, invoiceDate.ToString(...), bookFee, adminFee, totalFee, customerID);
Это беспокоит меня, чтобы видеть, что кто-либо берет Дату и хранит его в базе данных как Строка. Почему бы не тип столбца отражают действительность?
я также удивлен видеть, что SQL-запрос создается с помощью конкатенации строк. Я - Java-разработчик, и я не знаю C# вообще, но я задался бы вопросом, не было ли обязательного механизма вроде java.sql. PreparedStatement где-нибудь в библиотеке? Это рекомендуется для принятия мер против атак с использованием кода на SQL. Другое преимущество является возможными выигрышами в производительности, потому что SQL может анализироваться, проверяться, кэшироваться однажды и снова использоваться.
На самом деле метод ExecuteScalar возвращает первый столбец первой строки возвращаемого DataSet. В Вашем случае Вы только делаете Вставку, Вы на самом деле не запрашиваете данных. Необходимо запросить scope_identity () после того, как Вы - вставка (это - синтаксис для SQL Server), и затем у Вас будет свой ответ. Посмотрите здесь:
РЕДАКТИРОВАНИЕ: , Поскольку Michael Haren указал, Вы упомянули в своем теге, Вы используете MySql, используете last_insert_id (); вместо scope_identity ();