У меня есть система POS, которая будет использоваться для создания квитанций в двух разных местах. проблема, с которой я столкнулся сейчас, заключается в том, что, когда оба места вводят квитанцию одновременно, у них будет одинаковый идентификатор квитанции, и поэтому я сделал довольно плохой способ устранить эту проблему.Повторяющийся ключ на mysql
while (!success)
{
try
{
MySqlCommand myCommand4 = new MySqlCommand("Insert into OrderRecords_table values('" + OrderID + "','" + customerCode + "','" + customer + "','" + TelComboBox.Text + "','" + LicenseComboBox.Text + "','" +
DriverComboBox.Text + "','" + AddressComboBox.Text + "','" + LocationTypeComboBox.Text + "','" + PickupComboBox.Text + "','" + CustomerTypeLabel.Text + "','" +
Convert.ToDecimal(TotalPriceLabel.Text) + "','" + status + "','" + note + "','" + sandReceiptNo + "','" + createtiming + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')", myConnection52);
myCommand4.ExecuteNonQuery();
if (retried == true)
{
MessageBox.Show("收據號碼已改為: " + OrderID);
}
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1062:
retried = true;
OrderID = OrderID.Substring(0, 1) + (Convert.ToInt32(OrderID.Substring(1, OrderID.Length - 1)) + 1).ToString("00000");
success = false;
break;
}
}
}
я написал это, чтобы поймать исключение, и увеличить количество квитанций, когда этот ключ дубликата происходит, и она работала хорошо, когда я сначала проверить это, однако, не будет ловить исключения больше, и он просто вставляет запись.
Я не знаю, как это нарушает правила на mysql. ситуация прямо сейчас выглядит следующим образом: если у меня есть запись с номером чека: m00001 (orderID col) , а другая программа пытается вставить номер квитанции, который также является m00001, он должен поймать это исключение, но это вставьте оба m00001 как-то. (столбец OrderID задан как первичный ключ).
я делал некоторые исследования в Интернете, чтобы увидеть, если есть другой способ, чтобы решить эту проблему, и я нашел этот
INSERT INTO таблицы (а, б, в) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c = c + 1;
Однако это обновление старой записи вместо новой, есть ли другой способ, который будет обновлять тот, который я пытаюсь вставить, если он найден дублированным?
Thanks
Вы действительно должны обрабатывать первичный ключ самостоятельно? Почему бы не создать базу данных с соответствующим ключом (с колонкой автоинкремента)? Кстати, вы должны изучить, как использовать параметризованные запросы - то, что вы делаете, подвержено атакам с инъекциями. – germi
спасибо за ответ @germi, это возможно дать мне немного больше подробностей, я довольно новичок в этом. Кроме того, первичный ключ - это номер квитанции, в котором я избегаю иметь тот же номер квитанции в базе данных, поэтому я сделал его столбцом первичного ключа. –
Большинство систем баз данных могут автоматически генерировать действительный первичный ключ самостоятельно, чтобы разработчику не нужно координировать несколько вставок. Изучите руководство по MySQL (https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html). О параметризованных запросах, посмотрите [в этом учебнике] (http://zetcode.com/db/mysqlcsharptutorial/) (сначала я нашел через google, конечно же есть другие). – germi