Member 13151446 Ответов: 1

Как предотвратить вставку дублированных записей 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 снова войдет, вы получите это сообщение.

В принципе, это то, с чем никто действительно не может вам помочь, вам нужно посмотреть на свои данные и входные данные и понять, почему вы получаете ошибку, в чем причина ошибки и что вы хотите сделать, чтобы решить ее, мы не можем сделать это за вас.

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Нарушение ограничения первичного ключа "PK_khaas". Невозможно вставить дубликат ключа в объект 'dbo.khaas'. Заявление было прекращено.

Это и есть принцип ПЕРВИЧНЫЙ КЛЮЧ.
В принципе, SQL не позволяет 2 записям совместно использовать один и тот же первичный ключ, так как это значение идентифицирует каждую запись и, следовательно, должно быть уникальным.
Цитата:
Как предотвратить вставку дублированных записей SQL server с помощью приложения C# windows

Вы можете проверить, существует ли ключ, прежде чем вставлять новую запись.
Или еще лучше, пусть сервер сгенерирует для вас уникальный ключ.