以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  sql插入数据时提示重复中止  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=57917)

--  作者:happyft
--  发布时间:2014/10/8 10:49:00
--  sql插入数据时提示重复中止
下面是某个表beforesavedatarow的代码,目的时将新增加的“产品编码,工序号及仓库组合” 还不存在库存表的产品加入到库存表中。因为保存前有很多更新的动作全部都是添加到一个sql事务函数中统一执行的。
Dim edr As DataRow = e.DataRow
Dim flt2 As String = "仓库 = \'" & edr("仓库") & "\' and 产品编码 =  \'" & edr("产品编码") & "\' and 工序号 = " & edr("工序号")
\'---新增库存表中没有的产品编码
Dim Incol As String = "仓库,产品编码,品名,规格,工序号,工序名称,计量单位"
Dim Inval As String = "\'" & edr("仓库") & "\',\'" & edr("产品编码") & "\',\'" & edr("品名") & "\',\'" & edr("规格") & "\'," & edr("工序号") & ",\'" & edr("加工内容") & "\',\'" & edr("计量单位") & "\'"
str = "If not exists (Select * from 库存表 where " & flt2 & ")" & vbcrlf
str + = "begin " & vbcrlf
str + = "INSERT INTO 库存表 (" & Incol & ") VALUES(" & Inval & ")" & vbcrlf
str + = "End " & vbcrlf

SQLLIST.Add(str)  \'将语句添加到事务中

上面已经先用if not exists判断是否存在,不存在再insert.但是新的产品加入时总会提示重复(为避免重复,库存表中用产品编码,仓库,工序号三者建立了组合索引)

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20141008104617.jpg
图片点击可在新窗口打开查看

为什么会这样提示?
谢谢!




--  作者:Bin
--  发布时间:2014/10/8 10:53:00
--  
看提示似乎是主键重复了.你检查一下看看
--  作者:HappyFt
--  发布时间:2014/10/8 11:01:00
--  
提示是编码仓库工序号的组合唯一索引重复,我的问题是
在insert前明明有用
If not exists (Select * from 库存表 where " & flt2 & ")" 判断不存在重复才insert的,难道在同一个事务执行中不起作用?

--  作者:有点甜
--  发布时间:2014/10/8 11:20:00
--  
 回复3楼,请看好你数据库那里设置的主键是什么,主键是不能重复的。
--  作者:HappyFt
--  发布时间:2014/10/8 11:29:00
--  

主键是_Identify自动增长的,1楼的提示不是组合索引重复吗?


图片点击可在新窗口打开查看此主题相关图片如下:360截图20141008112534624.jpg
图片点击可在新窗口打开查看


--  作者:有点甜
--  发布时间:2014/10/8 11:37:00
--  

 你在哪一个表的beforesavedatarow写的事件?有可能是你保存两次了。


--  作者:有点甜
--  发布时间:2014/10/8 11:39:00
--  
 SQL语句应该是没错的,具体最好做个例子测试。
--  作者:HappyFt
--  发布时间:2014/10/9 21:47:00
--  
这个还是找不到原因,在每一个数据表的beforesavedatarow都有类似的代码,(因为每个表保存时跨表更新的数据都不同)。
怎么判断是保存了一次还是两次?因为保存都是按左上角那个保存按钮,难道按时不注意连续按两次会这样?应该保存过一次的第二次就不会保存了吧?

--  作者:有点甜
--  发布时间:2014/10/9 21:50:00
--  
 你单独做一个例子测试,看是否也出错,如果出错,上传上来。