C# 整洁的插入,检查是否存在记录

C# 整洁的插入,检查是否存在记录,c#,dapper,C#,Dapper,因此,我一直在使用此方法将记录插入数据库: TransactionBlock.Connection.Execute( "INSERT Table(Item,Id)VALUES(@Item, @Id); new {Item,Id = id }, TransactionBlock.Transaction); 我现在需要修改它,首先使用以下命令检查项目/id是否已经在数据库中: const

因此,我一直在使用此方法将记录插入数据库:

TransactionBlock.Connection.Execute(
                            "INSERT Table(Item,Id)VALUES(@Item, @Id);
                            new {Item,Id = id }, TransactionBlock.Transaction);
我现在需要修改它,首先使用以下命令检查项目/id是否已经在数据库中:

const sql=如果存在,请从表中选择*,其中Item=@Item…等


但我没有遇到过任何实现这一目标的例子。我可以通过创建存储过程来实现这一点,但是我想尝试使用这种方法来完成。

与其在插入之前检查它是否存在,为什么不使用try/catch时钟来执行插入并捕获DuplicateKeyException呢?不确定它是否存在以确定重复。

假设您使用的是SQL Server,并且您只想在不存在的情况下插入记录已经存在您正在查找的SQL是

IF NOT EXISTS (SELECT * FROM Table WHERE Id = @Id) 
    INSERT INTO Table(Item, Id) VALUES(@Item, @Id)
这只需要一条语句就行了

值得注意的是,根据基础DBMS的不同,您可能仍然存在争用-如果没有发出锁并且同时发生许多插入,那么您可能会在执行select时记录不存在,但在尝试插入之前记录不存在

如果您正在处理插入快速发生的情况,我建议您熟悉以下内容:


祝你好运

这与其说是一个简洁的问题,不如说是一个SQL问题。您正在使用SQL Server、MSSQL、Oracle等哪个后端?SQL Server。我可以使用从Dapper调用的纯SP实现我想要的,只是不确定如何使用Dapper显示内联检查。同意,这不是dapper的直接问题,只是如何:就我个人而言,我会在插入中加入WHERE条款,而不是两个单独的条款operations@MarcGravell如何做到这一点?插入TableItem,IdVALUES@Item,@Id WHERE Id@Id为我失败,关键字“WHERE”附近的语法错误。@user854301 try WHERE NOT EXISTS从Id=@Id@user854301如果你想一步到位,请看马特的答案;但是,这里显示的SQL很好too@MarcGravell,终于明白了。我已经用select替换了value,谢谢你的投票。如果可以防止异常,为什么要捕获异常?“感觉”不对。@avb1994,因为如果在表中插入100000个项目,并且可能有10%是重复的,那么系统地插入并检测重复的异常是有意义的。否则,每次插入将执行100000次读取。这就是我的理由。异常非常昂贵,不应该用来控制逻辑流。每次你抛出异常,一个小村庄就会被烧毁。@Raj你不是在逃避阅读。服务器必须读取索引值以确定是否存在冲突。无论如何,异常和错误的代价要高得多,因为它们不应该频繁发生
INSERT INTO TableName (Item, ID)
SELECT @Item, @Id WHERE NOT EXISTS ( SELECT 1 FROM TableName WHERE Id=@Id )