Нарушение ограничения PRIMARY KEY PK_login1. Невозможно вставить повторяющийся ключ в объект 'dbo.login1'

Я пытаюсь вставить некоторые данные на сервер sql, но получаю сообщение об ошибке типа «Нарушение ограничения PRIMARY KEY 'PK_login1'. Невозможно вставить повторяющийся ключ в объект 'dbo.login1'. Оператор был прерван.». Я попытался удалить ограничение первичного ключа из таблицы, после чего вижу, что в таблицу вставляются более двух похожих типов данных. Мой код

protected void btn_Submit_Click(object sender, EventArgs e)
{
    try
    {
        SqlCommand cmd;
        str = "Insert into login1 values ('" + txtbx_Uname.Text + "', '" + txtbx_Pwd.Text + "', '" + txtbx_Email.Text + "', '" + txtbx_Dob.Text + "', " + txtbx_Phone.Text + ")";
        con.Open();
        cmd = new SqlCommand(str, con);
        cmd.ExecuteNonQuery();
        lbl_Error.Visible = true;
        lbl_Error.Text = "Registration Success";
        int n = Convert.ToInt32(cmd.ExecuteScalar());
        if(n==1)
            Response.Redirect("Login.aspx");
        con.Close();
    }
    catch
    {
        lbl_Error.Visible = true;
        lbl_Error.Text = "SQL Server Error. Pleaase try after sometime";
    }
}

person Pritam    schedule 24.01.2013    source источник
comment
@COLDTOLD Я использую адрес электронной почты в качестве первичного ключа   -  person Pritam    schedule 24.01.2013
comment
тогда вы должны проверить, существует ли уже пользователь с таким же адресом электронной почты, прежде чем вставлять   -  person COLD TOLD    schedule 24.01.2013
comment
ваша проблема в том, что вы вставляете несколько данных с одним и тем же первичным ключом   -  person Iswanto San    schedule 24.01.2013
comment
@COLDTOLD мне интересно, почему один оператор вставки вставляет более одной записи за раз? Пожалуйста помогите.   -  person Pritam    schedule 24.01.2013
comment
Маленькие таблицы Бобби! - вам не следует объединять вместе свои операторы SQL - это открыт для атак с использованием SQL-инъекций. Вместо этого: используйте параметризованные запросы!   -  person marc_s    schedule 24.01.2013


Ответы (3)


Вы используете cmd.ExecuteNonQuery(); и int n = Convert.ToInt32(cmd.ExecuteScalar());, которые здесь выполняют ту же работу. Если вам нужен статус новой записи, которая была вставлена ​​в таблицу, измените запрос на хранимую процедуру или используйте другой запрос, чтобы узнать количество записей с указанным полем.

попробуйте следующий код.

    protected void btn_Submit_Click(object sender, EventArgs e)
    {
        try
        {
            SqlCommand cmd;
            str = "Insert into login1 values ('" + txtbx_Uname.Text + "', '" + txtbx_Pwd.Text + "', '" + txtbx_Email.Text + "', '" + txtbx_Dob.Text + "', " + txtbx_Phone.Text + ")";
     " _    
    & "SELECT @@IDENTITY AS int32;"
            con.Open();
            cmd = new SqlCommand(str, con);    
      int n = Convert.ToInt32(cmd.ExecuteScalar());  

            if(n==1)
            {
     lbl_Error.Visible = true;
            lbl_Error.Text = "Registration Success";  
                Response.Redirect("Login.aspx");
            con.Close();
           }
     }
        catch
        {
            lbl_Error.Visible = true;
            lbl_Error.Text = "SQL Server Error. Pleaase try after sometime";
        }

}

Надеюсь, это решит проблему.

person Tom Cruise    schedule 24.01.2013
comment
Привет! Не могли бы вы проверить этот код еще раз? На самом деле я не могу понять этот код. что такое _ & SELECT @@ IDENTITY AS int32; после ул? и под оператором if я думаю только один код lbl_Error.Visible = true; выполнит? Не могли бы вы снова отредактировать этот код? - person Pritam; 24.01.2013
comment
Обратите внимание на обновленный код. @@ IDENTITY вернет последнее значение идентификатора. если никакие строки не затронуты, он вернет null. Проблема с вашим кодом заключалась в том, что вы использовали executenonquery и executescalar, которые вставят запись дважды. - person Tom Cruise; 24.01.2013

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

person Srinivas    schedule 24.01.2013
comment
Подскажите, пожалуйста, почему оператор вставки вставляет более одной записи одновременно? - person Pritam; 24.01.2013

Ограничение PRIMARY KEY однозначно идентифицирует каждую запись в таблице базы данных. .

Первичные ключи должны содержать уникальные значения.

Столбец первичного ключа не может содержать значения NULL.

Каждая таблица должна иметь первичный ключ, и каждая таблица может иметь только ОДИН первичный ключ.

Перед вставкой

Вам необходимо проверить, присутствуют ли новые вставляемые значения в базе данных или нет. Если данных нет в базе данных, вставьте новые значения в базу данных, в противном случае отправьте пользователю сообщение «Данные уже присутствуют для данного ввода».

person andy    schedule 24.01.2013