2010-05-27 48 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

相關問題