2

我在 C# 中有一个插入方法。基本上如下,其中 url 是表中的唯一约束:

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

在一个查询中,我想得到:

  1. 插入行或已存在条目的 id
  2. 插入的行数(不计算已经存在的重复项)

我最初使用 ExecuteNonQuery 调用插入,并捕获 MySQL 重复异常(可以使用 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 属性,但当然不再引发异常,并且由于 UPDATE catch 从 ExecuteNonQuery 返回 1 并且似乎无法确定该行是插入还是重复。

使用 .NET (C#) 适配器(最好使用单个语句)确定记录 ID 和插入行数时,我最好的选择是什么?

有没有办法可以设置查询中受影响的行数?有没有一种方法可以在不显着性能下降的情况下为我提供两条信息?

4

1 回答 1

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
于 2013-04-04T01:44:31.723 回答