Получить ID для каждого соединения в программе для каждого «компьютера» - PullRequest
0 голосов
/ 19 марта 2020

Надеюсь, я смогу объяснить. У меня есть таблица с целым числом PK с автоинкрементом на MySQL сервере; и на стороне клиента два (или более) ПК, которые с помощью программы WinForm выполняют вставки, обновления и запросы.

Что произойдет, если?

  • PC01 вставит запись.

  • PC02 вставляет другую запись после PC01.

Но что, если PC01 запрашивает свой идентификатор (SELECT MAX ( ID) ИЗ таблицы) он получит идентификатор, сгенерированный записью, созданной PC02?

Учитывая, что вы входите в базу данных с пользователем, отличным от root. Какова лучшая альтернатива для получения правильного идентификатора для каждого соединения на каждом p c? Что я должен добавить или рассмотреть?

1 Ответ

2 голосов
/ 19 марта 2020

Использование 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...