Использование MAX для поиска последнего идентификатора, когда более одного клиента может быть вставлено одновременно, является огромной ошибкой. Используйте функцию LAST_INSERT_ID ()
Например, предположим, что вы вставляете в таблицу клиентов, в которой есть столбец AUTOINCREMENT и столбец имени
string SQLText = "INSERT INTO Customers (Name) VALUES (@name);SELECT LAST_INSERT_ID()";
using(MySqlConnection cn = new MySqlConnection(.....))
using(MySqlCommand cmd = new MySqlCommand(SQLText,cn))
{
cn.Open();
cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = "Steve";
int lastID = (int)cmd.ExecuteScalar();
....
}
Здесь важно то, что LAST_INSERT_ID возвращает автоматически сгенерированное значение для соединения, которое вызывает его. Таким образом, если у вас есть два соединения, каждое из которых имеет свой собственный идентификатор, возвращаемый
. Как прокомментировано ниже Bradley Grainger
, MySql предоставляет «нестандартное» свойство, которое называется LastInsertedId
из MySqlCommand
. class и это свойство содержит то же значение, которое вы можете получить из функции LAST_INSERT_ID()
. У меня смешанные чувства по поводу этой собственности. С определенной точки зрения это очень удобно, но если вы когда-нибудь планируете изменить базу данных, вам понадобится другая библиотека ado. net, и вам не будет доступен этот товар, и вам снова понадобится какая-то «пользовательская» функция чтобы получить тот же результат (например, SELECT SCOPE_IDENTITY()
для Sql Server).