2012-11-01 32 views
2

我在C#中有一个插入方法。本质上,下面,其中URL是在表中唯一contraint:插入并返回插入的行数(非重复)和记录的ID(新的或重复的)

INSERT INTO pages 
(url) VALUES ('http://www.google.com'); 

在一个单一的查询我想获得:

  1. 无论是插入行或条目的ID已经存在
  2. 插入(不包括已存在的重复)

我原先调用插入上述使用的ExecuteNonQuery和捕捉MYS所见的行数QL重复异常(可能使用了INSERT IGNORE,但由于查询的另一部分知道它不失败)。这使我得到了实际插入的行数的准确计数,但没有提供在重复情况下检索id的方式(如果行重复,则command.LastInsertedId返回-1)。

我再变声明如下:

INSERT INTO pages 
(url) VALUES ('http://www.google.com') 
ON DUPLICATE KEY UPDATE id= LAST_INSERT_ID(id); 

这能够正确更新command.LastInsertedId财产,当然不再抛出一个异常,因为更新渔获从的ExecuteNonQuery返回1,看似提供没有办法确定该行是插入还是重复。

在使用.NET(C#)适配器确定记录的id和插入行数方面,最好是使用单个语句来确定最佳选择是什么?

有没有一种方法可以设置我的查询中受影响的行数?有没有一种方法可以为我提供两条信息,而不会有明显的性能下降?

回答

0

我不确定这是否适用于mySql,但我会选择INSERT + SELECT方法。例如:

declare @prevID <column type> 
select @prevID = id from pages where url = 'http://www.google.com' 
if @prevID is null 
begin 
    insert into pages(url) values ('http://www.google.com') 
    select 1, @@identity 
end 
else 
    select 0, @prevID