2013-10-15 150 views
-1

这让我感觉有一段时间了。重复键错误

我有一个C#应用程序插入数据到MSSQL数据库。 它使用实体LINQ

列[ID]是主键,并且没有自动增加。

存在的数据,如:

id  other columns 
1001  ...... 
1002  ...... 
1003  ...... 

然后我得到新的数据:

ROW1: 1003 ....... 
ROW2: 1004 ....... 
ROW3: 1005 ....... 

的1003存在那么肯定ROW1将返回 “重复键1003错误” 但是,当我尝试插入其他人如 1004,1005他们是暂不存在

该程序将也返回我“重复密钥错误”, 并且无法插入。

然后我尝试数据库将sql客户端,只需插入'1004',它会通过。

我想是这样的插入缓冲, 或像“无或全部”建筑?

那我该怎么做呢?

我的代码是一个循环, 插入一行然后用dbconn.savechange()

+0

主键必须是唯一的;这是他们的本性。错误是由设计。我不知道我理解你的问题......你问你如何防止重复键错误? –

回答

0

这是一个全有或全无。从数据库中读取ID并手动删除重复的条目。

我建议检查最小值和最大值,并读取它们之间的值。这样你就不必读回所有的ID。

由于开销,这应该比尝试一次插入一个条目更快,并检查错误。

0

在你插入这个新的记录/行作为一个批处理,如果有任何错误,整批将是ROLLBACK,但是如果你将每条语句的这些记录作为一个单独的批次插入,那么1003的throw和error和sql执行将会继续执行其余的sql语句。

0

谢谢大家。

我找到一个解决方案,那就是 当我找到了重复键错误出来的第一次。 这意味着真正的重复键。

我重新建立的数据库连接:

   dbconn.Dispose(); 
       dbconn = new Entities(); 

那么这将工作

非常感谢! 希望这可以帮助其他人

+0

这可能意味着你错过了实体的linq,实体轻量级创建,所以你不应该做一个新的实体&坚持它,但重新创建一个你每次做一个新的查询(以便它不带状态从以前的查询)。这些是轻量级对象,意味着它们是短暂的,你应该将它封装在一个使用中:using(var entities = new Entities()){use entities here&if you need it later later you will redo a new using block,不要存储实体变量以便稍后重用它!} –