违反PRIMARY KEY约束。无法在对象中插入重复键 - ADO.NET

时间:2016-06-07 21:23:07

标签: c# sql-server

我正在尝试插入一个新人的数据,我可以在第一次尝试时,但是当第二次尝试时和第二次尝试时错误违反了主键,事实上,每次有人ID(personId)都会增加正在尝试添加新人,因此我意识到错误是主键

表人

strFileToOpen = "/path/FileName.png"

创建和插入新人的方法

CREATE TABLE [dbo].[Person] (
    [personID]    INT NOT NULL,
    [personName] VARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([personID] ASC)
);

任何建议?

4 个答案:

答案 0 :(得分:4)

您当前的代码无法再次运行,因为您递增的id变量是在堆栈上分配的局部变量。方法退出时,堆栈中的所有内容都将被清除。再次单击按钮重新输入方法,但变量重置为零,并且您的增量再次将变量设置为1.因此,personID字段的重复异常。

我建议您更改添加IDENTITY属性的personID列 通过这种方式,数据库自己计算要分配给personID字段的下一个值,并且您不需要记住分配给表的最后一个id(这实际上是不可能以安全的方式实现的)多用户环境)

添加IDENTITY属性后,您可以将数据库指定的值回读到personID字段,将查询更改为

string command = @"INSERT INTO [Person] ([personName]) 
                   OUTPUT INSERTED.personID
                   VALUES (@name)";

并使用ExecuteScalar

运行查询
  int id = Convert.ToInt32(cmd.ExecuteScalar());

答案 1 :(得分:1)

如果您不关心personID字段的实际价值(您的代码似乎表明了这一点)。而且,只是希望它是唯一的并且增加1。

在说明@Steve指示的内容时,您可以通过以下方式定义表:(在T-SQL中)

CREATE TABLE [dbo].[Person] (
[personID] [int] IDENTITY(1,1) NOT NULL,
[personName] VARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([personID] ASC)
);

这将消除您插入personID的需要

protected void BtnCreate(object sender, EventArgs e)
    {
      SqlConnection connection = new SqlConnection(connectionString);

      //command
      string command = "INSERT INTO [Person] ([personName]) VALUES (@name)";

      SqlCommand cmd = new SqlCommand(command, connection);
      cmd.Parameters.AddWithValue("@name", name.Text);
      connection.Open();
      cmd.ExecuteNonQuery();
      connection.Close();
    }

答案 2 :(得分:1)

谢谢大家,你的所有答案都是正确的,但是我找到了一个更好的解决方案,我使用id作为静态值初始化至少一个并且放弃了功能,它没有任何错误工作,并按我的意愿工作我感谢你的时间和可用性

我的桌子不需要使用身份,因为我打算每次点击按钮创建新人时输入ID增量

CREATE TABLE [dbo].[Person] (
    [personID]    INT NOT NULL,
    [personName] VARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([personID] ASC)
);

我使用了static int id = -1,功能不正常

//id to new person
private static int id = -1;

protected void BtnCreate(object sender, EventArgs e)
    {
      SqlConnection connection = new SqlConnection(connectionString);

      //command
      string command = "INSERT INTO [Person] ([personID], [personName]) VALUES (@id, @name)";

      SqlCommand cmd = new SqlCommand(command, connection);
      cmd.Parameters.AddWithValue("@id", id++);//id increase
      cmd.Parameters.AddWithValue("@name", name.Text);
      connection.Open();
      cmd.ExecuteNonQuery();
      connection.Close();
    }

答案 3 :(得分:0)

史蒂夫有一个很好的答案,或者如果不能重新安排你的数据库架构,那么你可以这样做:

protected void BtnCreate(object sender, EventArgs e)
{
  SqlConnection connection = new SqlConnection(connectionString);

  connection.Open();

  SqlCommand idcommand = new SqlCommand("select max([personID]) from Person", connection)
  //id to new person
  int id = ((int)idcommand.ExecuteScalar()) + 1;
  //command
  string command = "INSERT INTO [Person] ([personID], [personName]) VALUES (@id, @name)";

  SqlCommand cmd = new SqlCommand(command, connection);
  cmd.Parameters.AddWithValue("@id", id++);//id increase
  cmd.Parameters.AddWithValue("@name", name.Text);
  cmd.ExecuteNonQuery();
  connection.Close();
}