Hari Krishna Prasad Inakoti Ответов: 5

Нарушение ограничения первичного ключа 'PK_LogIn'. Невозможно вставить дубликат ключа в объект dbo.Логин".


Привет,
я также создал страницу входа в систему и одну регистрационную форму.В этой регистрационной форме есть кнопка Отправить.Я написал этот код, пожалуйста, проверьте его один раз и решите мою проблему.

protected void Button1_Click(object sender, EventArgs e)
{
    con.Open();
    cmd = new SqlCommand("insert into LogIn Values('" + txtfname.Text + "','" + txtlname.Text + "','" + txtuname.Text + "','" + txtpwd.Text + "','" + txtcpwd.Text + "')", con);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("FirstName", txtfname.Text);
    cmd.Parameters.AddWithValue("LastName", txtlname.Text);
    cmd.Parameters.AddWithValue("UserName", txtuname.Text);
    cmd.Parameters.AddWithValue("PassWord", txtpwd.Text);
    cmd.Parameters.AddWithValue("ConfirmPassWord", txtcpwd.Text);
    cmd.ExecuteNonQuery();
    da = new SqlDataAdapter("Select * from LogIn", con);
    ds = new DataSet();
    da.Fill(ds, "LogIn");
    Response.Write("Registration Completed Successfully");
    clear();
    con.Close();
}


Ошибка:
Нарушение ограничения первичного ключа 'PK_LogIn'. Невозможно вставить дубликат ключа в объект dbo.Логин".
Выполнение данной инструкции было прервано

Simon Bang Terkildsen

Какой столбец является вашим первичным ключом?

Thiagarajan Duraisamy

дайте нам структуру таблицы, без которой нам трудно дать вам причину. Чтобы сказать, что имя пользователя является первичным ключом в таблице ur, попробуйте настроить таблицу и попробуйте вставить ее снова.

5 Ответов

Рейтинг:
2

Om Prakash Pant

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

перед вставкой в базу данных проверьте, существует ли уже идентификатор пользователя или нет. Если нет, то вставьте данные.


Simon Bang Terkildsen

Что говорит вам о том, что имя пользователя является первичным ключом? кроме того, это был бы единственный разумный ключ к столбцам.

Проверка того, существует ли имя пользователя уже перед вставкой, не является решением, если только вы не заблокируете таблицу перед проверкой. в противном случае кто-то может вставить имя пользователя после того, как вы его проверили, и до того, как вы его вставили. Если предположить, что имя пользователя является первичным ключом, то OP захочет поймать исключение и обработать его так, как если бы имя пользователя уже было взято.

Рейтинг:
1

Mario Majčica

Очевидно, что проблема заключается в данных, которые вы пытаетесь сохранить. По возможности измените значение поля, объявленного первичным, или удалите запись с ключом, который вы пытаетесь вставить. В противном случае используйте обновление!


Овации


Рейтинг:
0

Simon Bang Terkildsen

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

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


André Kraak

Хороший ответ, мой 5.

Рейтинг:
0

Mehdi Gholam

Одна из ваших колонок, которую вы вставляете, - это Primary Key и вы не можете вставить дубликаты первичных ключей (возможно, имя пользователя).

Вы должны сначала проверить, а затем вставить.


Simon Bang Terkildsen

Сначала проверка, а затем вставка-это не очень хорошее решение, у вас будет состояние гонки. См. мой комментарий к первому решению.

Mehdi Gholam

Согласен, я имел в виду на более высоком уровне, т. е. на уровне приложения и показывая ошибку и т. д.

Рейтинг:
0

hitech_s

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


подобный этому

private bool checkexistornot(string username)
{
con.Open();
   cmd = new SqlCommand("select fname from LogIn where UserName="+username, con);
   cmd.CommandType = CommandType.Text;


   cmd.Parameters.AddWithValue("UserName", txtuname.Text);


   object obj=cmd.ExecuteScalar();

  con.Close();
if(obj!=null)
return false;
else
return true;

}




protected void Button1_Click(object sender, EventArgs e)
{
if(checkexistornot())
{
    con.Open();
    cmd = new SqlCommand("insert into LogIn Values('" + txtfname.Text + "','" + txtlname.Text + "','" + txtuname.Text + "','" + txtpwd.Text + "','" + txtcpwd.Text + "')", con);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("FirstName", txtfname.Text);
    cmd.Parameters.AddWithValue("LastName", txtlname.Text);
    cmd.Parameters.AddWithValue("UserName", txtuname.Text);
    cmd.Parameters.AddWithValue("PassWord", txtpwd.Text);
    cmd.Parameters.AddWithValue("ConfirmPassWord", txtcpwd.Text);
    cmd.ExecuteNonQuery();
    da = new SqlDataAdapter("Select * from LogIn", con);
    ds = new DataSet();
    da.Fill(ds, "LogIn");
    Response.Write("Registration Completed Successfully");
    clear();
    con.Close();
}
else
{
    Response.Write("user with this already exist please select another name");
}
}


Simon Bang Terkildsen

Сначала проверка, а затем вставка-это не очень хорошее решение, у вас будет состояние гонки. См. мой комментарий к первому решению.