Member 13111663 Ответов: 4

У меня есть ошибка. В нем говорилось о нарушении ограничения первичного ключа "PK_medicalregistration". Не удается вставить повторяющийся ключ в ДБО.медицинская Регистрация'. Повторяющееся значение ключа: (17002) Ребята пожалуйста помогите мне


public void updatedata()
        {
            try
            {
                DialogResult dr = MetroMessageBox.Show(this, "Are You Really want to update dependent Record..", "Dependent Update Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.No)
                {
                    return;
                }
                else
                {
                    con.Open();

                    cmd = new SqlCommand();
                    cmd.Connection = con;
                    cmd.CommandText = "update MedicalRegistration set Client_ID =  '" + txtID.Text + "', Date_Registered =  '" + dtpDate.Text + "', Date_of_Released = '" + dateTimePicker1.Text + "', Client_Name =  '" + txtClient.Text + "', BirthDate =  '" + dtpBday.Text + "', Age =  '" + txtAge.Text + "', Gender =  '" + cbGender.Text + "', Civil_Status =  '" + cbStatus.Text + "', Address =  '" + txtAddress.Text + "', Cellphone_Number =  '" + mtxtCell.Text + "', Telephone_Number =  '" + mtxtTell.Text + "', Religion =  '" + txtReligion.Text + "', Place_of_Birth =  '" + txtPOB.Text + "', Primary_Education =  '" + txtPrimary.Text + "', Secondary_Education =  '" + txtSec.Text + "', Tertiary_Education =  '" + txtTertiary.Text + "', Final_Diagnosis =  '" + txtFinalDiagnosis.Text + "', Amount =  '" + txtAmount.Text + "', Claimant_Name =  '" + txtClaimant.Text + "'";
                    cmd.ExecuteNonQuery();
                    MetroMessageBox.Show(this, "Successfuly Update Data", "UPDATE Data", MessageBoxButtons.OK, MessageBoxIcon.Question);

                    con.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Try Again" + ex);
            }
        }


Что я уже пробовал:

Выше приведен мой код кнопки обновления, когда я нажал кнопку обновления, он выдал ошибку нарушения ограничения первичного ключа 'PK_medicalregistration'. Не удается вставить повторяющийся ключ в ДБО.медицинская Регистрация'. Повторяющееся значение ключа: (17002). Помогите!

Bryian Tan

Ошибка явно указывает на код, пытающийся вставить запись с первичным ключом, который уже существует в таблице. Я предполагаю, что Client_ID является первичным ключом, оператор update должен иметь значение WHERE Client_ID = txtID.Текстовое предложение, верно? или как запрос узнает, какую запись нужно обновить? Прямо сейчас ваш запрос пытается обновить все записи в таблице.

4 Ответов

Рейтинг:
1

Dave Kreskowiak

Во-первых, этот код генерации SQL ужасен. Google для "атаки SQL-инъекций", чтобы узнать, почему то, что вы делаете, так плохо. Google для "параметризованного запроса C# sql", чтобы узнать, что с этим делать, и в то же время сделать ваш код намного проще для отладки.

В инструкции SQL UPDATE нет предложения WHERE, идентифицирующего запись, которую вы хотите обновить. Ваш оператор обновления никогда не должен устанавливать идентификатор записи. Yours делает это, и поскольку у вас нет предложения WHERE, он изменяет идентификатор каждой записи в таблице на любое предоставленное вами значение ID. Поскольку у вас не может быть более одной записи с одним и тем же идентификатором первичного ключа, вы получаете это сообщение об ошибке.


Рейтинг:
1

Bryian Tan

Как я уже упоминал ранее, похоже, что в коде отсутствует предложение WHERE (WHERE Client_ID = txtID. Text). Прямо сейчас запрос обновит все записи в базе данных с той же информацией. Разве что в таблице есть только одна запись, в чем я сомневаюсь.

cmd.CommandText = "update MedicalRegistration set Date_Registered =  '" 
                        + dtpDate.Text + "', Date_of_Released = '" + dateTimePicker1.Text + "', Client_Name =  '" 
                        + txtClient.Text + "', BirthDate =  '" + dtpBday.Text + "', Age =  '" + txtAge.Text + "', Gender =  '" 
                        + cbGender.Text + "', Civil_Status =  '" + cbStatus.Text + "', Address =  '" + txtAddress.Text + "', Cellphone_Number =  '" 
                        + mtxtCell.Text + "', Telephone_Number =  '" + mtxtTell.Text + "', Religion =  '" + txtReligion.Text + "', Place_of_Birth =  '" 
                        + txtPOB.Text + "', Primary_Education =  '" + txtPrimary.Text + "', Secondary_Education =  '" + txtSec.Text + "', Tertiary_Education =  '" 
                        + txtTertiary.Text + "', Final_Diagnosis =  '" + txtFinalDiagnosis.Text + "', Amount =  '" + txtAmount.Text + "', Claimant_Name =  '" 
                        + txtClaimant.Text + "' WHERE Client_ID=" + txtID.Text;


Как только вы все уладите, попробуйте использовать параметризованный запрос в коде, чтобы свести к минимуму возможность SQL-инъекции.

Построение динамического SQL в хранимой процедуре[^]
Как выполнить параметризованный запрос[^]

Вот пример того, как межсайтовые скрипты и уязвимости SQL-инъекций превращаются в кошмар.
SQL-инъекция и межсайтовые Скрипты[^]


Member 13111663

Как сделать параметризованный запрос? Пожалуйста ребята мне очень нужен этот код для моего проекта

Bryian Tan

Вот еще один пример. Вы должны иметь возможность следовать ему или скачать исходный код и изучить его. Начните с простого запроса и постройте его оттуда.
Использование параметризованных запросов для предотвращения атак SQL-инъекций в SQL Server[^]

Рейтинг:
1

Patrice T

Цитата:
ошибка нарушения ограничения первичного ключа "PK_medicalregistration". Не удается вставить повторяющийся ключ в ДБО.медицинская Регистрация'. Повторяющееся значение ключа: (17002).

Это вопрос знания SQL.
Первичный ключ-это поле, которое имеет уникальное значение для каждой записи, по определению, 2 записи не могут иметь один и тот же первичный ключ.
Ограничение первичного ключа SQL[^]
Первичный ключ SQL[^]
Ограничение внешнего ключа SQL[^]
SQL автоматическое увеличение поля[^]

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
1

kp564

вы пытаетесь обновить значение первичного ключа, которое не разрешено в SQL. Из вашего запроса на обновление удалите первичный ключ.


CHill60

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

create table testPK ( pk int PRIMARY KEY, somedata nvarchar(125))

insert into testPK values (1, 'first set of data'),(2, 'second set of data')
тогда это совершенно законно
update testPK set pk = 3 where pk = 1
... Не советовал, наверное, но разрешил.
Кроме того, настоящая проблема была выявлена несколько часов назад.