【问题标题】:Violation of UNIQUE KEY constraint Cannot insert duplicate key in object违反 UNIQUE KEY 约束无法在对象中插入重复键
【发布时间】:2014-01-27 09:25:33
【问题描述】:

------------这是我更新表的sql过程--------------- ---------

create procedure sp_stepUpdate
@ID int,
@StepOrder int

AS
BEGIN  


IF OBJECT_ID('tempdb.dbo.#UpdateBatch','u') IS NOT NULL
begin
DROP TABLE #UpdateBatch
end

IF OBJECT_ID('tempdb.dbo.#UpdateBatch2','u') IS NOT NULL
begin
DROP TABLE #UpdateBatch2
end

create table #UpdateBatch2
(
ID int,
StepOrder int
)

insert into #UpdateBatch2 values (@ID,@StepOrder)

Select *,ROW_NUMBER() OVER(ORDER BY ID) as newIID into #UpdateBatch
from #UpdateBatch2

set identity_insert [ODM_BatchSteps] ON

Update [ODM_BatchSteps]
set [StepOrder] = newIID
From #UpdateBatch 
where [ODM_BatchSteps].ID = #UpdateBatch.ID

set identity_insert [ODM_BatchSteps] off
END
go

---------------这是我在程序中从列表中获取新订单的代码------

    connection.Open()


    For Each item As ListViewItem In ListView1.Items

        Dim command As SqlCommand = New SqlCommand("sp_stepUpdate", connection)
        command.CommandType = CommandType.StoredProcedure
        command.Parameters.AddWithValue("@ID", item.SubItems(0).Text)
        command.Parameters.AddWithValue("@StepOrder", item.SubItems(1).Text)
        command.ExecuteNonQuery()
    Next

我尝试使用列表视图中的新订单更新表时违反了 UNIQUE KEY 约束

-----------这是我要更新的订单的表格-----

    create table [dbo].[ODM_BatchSteps]
(
[ID] uniqueidentifier primary key not null default newid(),
[StepOrder]int ,
[StepType]int,
[StepGrid]nvarchar(max),
[BatchGrid]int,
foreign key (BatchGrid) REFERENCES ODM_Batches(ID)
)

【问题讨论】:

  • 那么问题是什么?
  • 旁注:CREATE PROCEDURE:“在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。使用前缀可以如果存在同名的系统过程,则会导致应用程序代码中断。”
  • 在 ODM_BatchSteps 表中的 StepOrder 列上是否有唯一索引?
  • 对不起,我的朋友,我正在尝试按行号更新我的表中的(StepOrder)...新订单在我的程序中通过按钮(作品)在列表视图中向上或向下移动.. . 当我通过新订单时,它必须更新表格中的订单......希望这有任何意义
  • steve--- 拥有它但刚刚删除它.. 但现在似乎没有发生任何变化(没有错误)

标签: sql sql-server vb.net


【解决方案1】:

该错误表示您正在尝试插入数据库中已存在的键值(id?)。 我只看到一个插入语句,所以你最好检查一下你传递给它的值..

【讨论】:

    【解决方案2】:

    我想您的字段 BatchGrid 标识了一组要按特定顺序保存的记录。
    如果是这种情况,并且没有引用您的 ODM_BatchSteps 字段的外键,正确重写此记录块的粗鲁但有效的方法是删除引用相同 BatchGrid 的每个条目,然后重新插入所有内容从您的 ListView 项目中

    Dim tran as SqlTransaction
    Try
        connection.Open()
        tran = connection.BeginTransaction()
        Dim command As SqlCommand = new SqlCommand("DELETE FROM ODM_BatchSteps WHERE BatchGrid = @grd", connection, tran)
        command.Parameters.AddWithValue("@grd", currentGrid)
        command.ExecuteNonQuery()
        For Each item As ListViewItem In ListView1.Items
    
            ' Now we INSERT every item in the grid passing the parameters 
            ' required to rebuild the block of records for the same BatchGrid
            command = New SqlCommand("usp_stepInsert", connection, tran)
            command.CommandType = CommandType.StoredProcedure
            command.Parameters.AddWithValue("@ID", item.SubItems(0).Text)
            command.Parameters.AddWithValue("@StepOrder", item.SubItems(1).Text)
            command.Parameters.AddWithValue("add the other parameters to rebuild the record")
            command.ExecuteNonQuery()
        Next
        tran.Commit()
    Catch Ex as Exception
        ' Log the exception, message to user ???
        tran.RollBack
    End Try
    

    当然,您的 sp_stepUpdate 应该重命名并重写 (usp_stepInsert?) 以接受以正确的步骤顺序插入新记录所需的所有参数

    如果这是一种可行的方法,那么您可以尝试使用 Table Valued Parameter 来提高性能,而不是为每个项目单独调用数据库

    【讨论】:

      【解决方案3】:

      好的,非常感谢您的帮助...采取简单的方法并添加计数以添加新订单的编号行,将其替换为新表中数据库中的旧 StepOrder

      -------- sql更新---------

      Update [ODM_BatchSteps]
      set ODM_BatchSteps.StepOrder = UpdateBatch2.StepOrder
      From UpdateBatch2 
      where [ODM_BatchSteps].ID = UpdateBatch2.ID
      

      ---------------- 程序中的代码 ---------------------

      Dim count As Integer

          For Each item As ListViewItem In ListView1.Items
              count = count + 1
              Dim command As SqlCommand = New SqlCommand("sp_stepUpdate", connection)
              command.CommandType = CommandType.StoredProcedure
      
              command.Parameters.AddWithValue("@ID", item.SubItems(0).Text)
              command.Parameters.AddWithValue("@StepOrder", count)
              command.Parameters.AddWithValue("@StepType", item.SubItems(2).Text)
              command.Parameters.AddWithValue("@StepGrid", item.SubItems(3).Text)
              command.Parameters.AddWithValue("@BatchGrid", item.SubItems(4).Text)        
              command.ExecuteNonQuery()
      
          Next
      
      
              connection.Close()
      

      【讨论】:

        猜你喜欢
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        相关资源
        最近更新 更多