Как предотвратить вставку дублированных записей SQL server с помощью приложения C# windows
Я получаю ошибку, когда вставляю те же данные в текстовое поле txtKVNumber. Ошибка выглядит так: произошла ошибка, пожалуйста, повторите попытку позже. Нарушение ограничения первичного ключа "PK_khaas". Невозможно вставить дубликат ключа в объект 'dbo.khaas'. Заявление было прекращено.
Что я уже пробовал:
private void btnKSave_Click(object sender, EventArgs e) { try { if (txtKVNumber.Text == "") { string myStringVariable1 = string.Empty; MessageBox.Show("Vehicle Number is required"); } else if (cboKVColor.Text == "") { string myStringVariable2 = string.Empty; MessageBox.Show("Select Vehicle Color"); } else if (cboKVBrand.Text == "") { string myStringVariable3 = string.Empty; MessageBox.Show("Select Vehicle Brand"); } else if (cboKVType.Text == "") { string myStringVariable12 = string.Empty; MessageBox.Show("Select Vehicle Type"); } else if (txtKOName.Text == "") { string myStringVariable5 = string.Empty; MessageBox.Show("Owner Name is required"); } else if (txtKCivilID.Text == "") { string myStringVariable7 = string.Empty; MessageBox.Show("Civil ID is required"); } else if (txtKTelephone.Text == "") { string myStringVariable8 = string.Empty; MessageBox.Show("Telephone Number is required"); } else { command = new SqlCommand("insert into khaas( VNumber, VColor, VType, VBrand, ExpiryDate, DaysLeft, OName, CivilID, Telephone ) VALUES (@vnumber, @vcolor, @vtype, @vbrand, @expirydate, @daysleft, @ownername, @civilid, @telephone )", con); con.Open(); command.Parameters.AddWithValue("@vnumber", txtKVNumber.Text); command.Parameters.AddWithValue("@vcolor", cboKVColor.Text); command.Parameters.AddWithValue("@vtype", cboKVType.Text); command.Parameters.AddWithValue("@vbrand", cboKVBrand.Text); command.Parameters.AddWithValue("@expirydate", dateTimePickerKhaas.Value.ToString("MM/dd/yyyy")); command.Parameters.AddWithValue("@daysleft", txtKDaysLeft.Text); command.Parameters.AddWithValue("@ownername", txtKOName.Text); command.Parameters.AddWithValue("@civilid", txtKCivilID.Text); command.Parameters.AddWithValue("@telephone", txtKTelephone.Text); command.ExecuteNonQuery(); con.Close(); MessageBox.Show("Inserted Successfully"); grd_fillKhaas(); txtKVNumber.Text = ""; cboKVColor.Text = ""; cboKVType.Text = ""; cboKVBrand.Text = ""; dateTimePickerKhaas.Value = DateTime.Now; txtKDaysLeft.Text = ""; txtKOName.Text = ""; txtKCivilID.Text = ""; txtKTelephone.Text = ""; } } catch (Exception ex) { MessageBox.Show("An error has occurred, please try again later." + ex.Message); } finally { con.Close(); } }
Richard MacCutchan
Сначала вам нужно проверить базу данных, чтобы убедиться, что этот номер уже существует.
Andy Lanng
Либо это, либо добавить Where not exists (select * from t where id = @id)
.
команда command.ExecuteNonQuery();
возвращает int количества вставленных строк. Если это ноль, то он уже существовал. Это немного больше намотано в коде, но сокращает количество вызовов sql
F-ES Sitecore
В дополнение к проверке данных на то, что первичный ключ еще не существует (мы не знаем вашей схемы БД, поэтому не знаем, какие поля находятся в вашем ПК), вы также должны изящно обработать эту ошибку с помощью try\catch Error handling и сообщить пользователю, как это возможно, что данные вставляются между вами, проверяя, есть ли они там, и вставляя их самостоятельно.
Кроме того, может быть, что есть проблема с вашими данными, и вы хотите, чтобы они имели другое значение, чем они есть. Например, если у вас есть целочисленное поле, которое является PK, и вы неправильно обрабатываете свои данные, и 0 входит в качестве значения, то в следующий раз, когда вы не обработаете свои данные правильно и 0 снова войдет, вы получите это сообщение.
В принципе, это то, с чем никто действительно не может вам помочь, вам нужно посмотреть на свои данные и входные данные и понять, почему вы получаете ошибку, в чем причина ошибки и что вы хотите сделать, чтобы решить ее, мы не можем сделать это за вас.