【问题标题】:Violation Of Primary Key in ASP.NET and SQL Server违反 ASP.NET 和 SQL Server 中的主键
【发布时间】:2016-04-26 21:08:21
【问题描述】:

我想将书添加到我的 Book_Master 表中。但是我遇到了违反主键的错误。我真的不明白重复值,因为我是通过代码生成 bookid(主键)然后从哪里发生重复?

【问题讨论】:

  • 请发布您的表定义,以便我们查看约束。您不需要通过代码将标识插入到 SQL Server 中的表中,它可以设置为自动递增。
  • 您正在尝试将值为 9 的数据插入该字段,但您已经在该字段中输入了 9。这是一个唯一字段,因此您不能有两个具有相同值的实例。
  • 为了强调,我在回应 Ron 的暗示和 Rich Benner 在下面指出的内容。该代码可能容易受到 Sql Server Injection 攻击,这是通常被利用的东西。 blogs.msdn.microsoft.com/sqlphp/2008/09/30/…
  • 尝试使用自动生成的主键
  • 请粘贴您的代码。我们无法复制/粘贴屏幕截图,因此很难提供进一步的更正。

标签: c# asp.net sql-server database


【解决方案1】:

尝试替换:

INSERT INTO Book_Master (bookid, booktitle....

与:

INSERT INTO Book_Master (booktitle....

一般来说,当插入带有标识列的表时,不能传递自己的。

另外请考虑用户输入以下书名的后果:

';drop table Book_master

【讨论】:

    【解决方案2】:

    您已经在for( int i = 0; i < counter ; i++) 循环中执行了 SqlCommand……但没有生成 bookid。 Google sql injection 了解为什么这是构建 SQL 语句的一种非常糟糕的方式。

    编辑:

    因此,基本问题是,您需要为 book_detail 添加尽可能多的副本……但对于 book_master 只需一次。

    这里有几个问题。首先,只需像您拥有它一样插入 book_master 一次...通过以下方式:

    for (int i=0; i < counter; i++ ){
    

    ...以及匹配...

    }
    

    ...出去。

    然后,在 cmdSave.ExecuteNonQuery() 之后,使用相同的打开连接,编辑 cmd.Command 文本以插入到 book_detail。我们不知道 book_detail 中包含哪些字段...但这是将进入循环中的语句。

    通常,您希望设置语句,以便可以多次重复使用该语句...使用不同的参数。这就是你如何防止人们一直试图警告你的 sql 注入问题。它看起来像这样:

    cmdSave.CommandText = "insert sometable(a,b) values (@a,@b)";
    cmdSave.Parameters.Add( "@a", SqlDbType.String, 4 );  // for example
    cmdSave.Parameters.Add( "@b", SqlDbType.Int );        // for example
    
    for( int i=0;i<counter;i++){
      cmdSave.Parameters["@a"].Value = GetNextValueA(i);  // for example
      cmdSave.Parameters["@b"].Value = GetNextValueB(i);  // for example
      cmdSave.ExecuteNonQuery();
    }
    

    【讨论】:

    • 我只是想通过循环在数量文本框中添加许多书籍副本......我没有使用for循环来生成bookid
    • 对 - 但如果 book_id 是主键,您不能将多条记录放入 book_master。
    • 您的插入语句在循环内...将其移至循环后
    • 这就是我被卡住的地方......我不知道如何将书籍副本保存到数据库中的 Book_Detail 表中......我想将书籍数据保存在 Book_Master 表和该表的副本中预订到 Book_Detail ... @Clay
    • @khaafi,我明白了...将编辑我的答案以概述要做什么
    【解决方案3】:

    bookid 设为自动递增的数字

    ALTER TABLE book_master ALTER COLUMN bookid INT NOT NULL IDENTITY
    

    【讨论】:

    • 我不想自动增加 bookid .. 我想通过最大查询增加
    • 那么您将需要在序列化事务中以独占方式锁定表。但这会带来一系列您尚未准备好的问题,因此只需按照预期的方式使用数据库即可。
    • 谢谢伙计……其实我是编程新手……这就是为什么……非常感谢您的宝贵回答
    • 我不打算对此刻薄,但我已经这样做了近 20 年,甚至在尝试在外部模拟自动编号时我搞砸了一半的时间数据库。
    • @Jonathen 感谢您的宝贵时间
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多