2010-05-27 50 views
0

我有以下代码:什么值应该.net SqlCommand.ExecuteNonQuery()返回,如果没有行受到影响?

int result = -1; 
StringBuilder sb = new StringBuilder(); 
SqlCommand cmd = MyConnection. 
sb.AppendLine("delete from Table1 where ID in"); 
sb.AppendLine("(select id from Table1 t1 where not exists(select * from Table2 t2 where t2.Table1ID = t1.ID))"); 
cmd.CommandText = sb.ToString(); 
result = cmd.ExecuteNonQuery(); 
_log.Info("StoredXMLDocument Records Deleted: " + result.ToString()); 

即SQL,更可读的格式是:

delete from Table1 where ID in 
(select id from Table1 t1 where not exists(select * from Table2 t2 where t2.Table1ID = t1.ID)) 

我知道SQL,当数据库中直接执行,删除任何行。但是,当此代码运行时,结果的值为1. I was expecting it to be 0。 Table1上没有触发器。我错过了什么吗?为什么是1?

附录:好的,现在当我在数据库中运行sql时,它会删除一行。请注意,在进行所有测试之前,我从仅为此目的保存的备份中恢复数据库。我发誓,今天早上或昨天下午没有删除任何行,是的,这是在恢复备份之后。我会让我疯狂的药丸磨损,并在今天下午重新审视这个问题。希望更清晰的头脑。

+0

你是如何验证这个SQL删除数据库中没有行的? – 2010-05-27 14:20:16

+0

通过在SqlServer Management Studio中直接在数据库中运行实际的SQL,并查看结果是什么。 – peacedog 2010-05-27 14:27:46

+0

是否有可能找回子查询中的行? – 2010-05-27 14:41:45

回答

1

它应该返回0

尝试比较SELECT COUNT(*) Table1之前和之后的DELETE

+0

所以我想这个问题变成“为什么它返回1?” – peacedog 2010-05-27 14:17:41

+0

计数与我的预期相同。我得跳下去参加一个会议,但是当我回来的时候,我会张贴更多的代码,因为在别的地方会有副作用造成这种情况。 – peacedog 2010-05-27 14:20:15

0

作为一个侧面说明,你的查询可以简化为:

delete from Table1 where ID not in (select Table1ID from Table2) 

试试这个利息的缘故:

delete from Table1 where 1 = 0 --we know this will delete no rows 

另外,请确认是否有在Table1任何触发器。

+0

我知道查询可以被简化,但它不是我的SQL,我不会在与其他人交谈之前搞砸它。 Table1没有触发器,我忘记了原来的添加。我会尝试使用备用的sql语句来查看会发生什么。 – peacedog 2010-05-27 14:31:52

相关问题