比如:deleteSQLWhere="delete TableA where ID in(1,2,3,4,5)";
try { int i = sqlHelper.ExecuteNonQuery(CommandType.Text, deleteSQLWhere); if (i > 0) { return true; } } catch (Exception ex) { LogMsg.WriteLog(ex.ToString()); return false; } return false;
假如in里的ID全部存在,一般情況下,結果會是三種情況:
返回0,表示TableA沒有in里的ID,所以執行失敗。
返回5,表示成功刪除5條數據。
由於表約束或主外鍵關聯,導致無法刪除的異常。還有語法錯誤。
如果是這樣的話,上面的代碼判斷是正確的。我在懷疑有沒有一種情況,比如說"delete TableA where ID in(1,2,3,4,5)",假設in里的數據存在且沒有主外鍵關聯等因素制約,會不會出現一部分執行成功,而另外一部分執行失敗的情況呢?
假如這樣的話,ADO.Net上對sql的執行結果判斷就不嚴謹了。因為上面那段代碼的本意是:這5條數據要么全部被刪除,要么全部沒有被刪除,此時i>0就不能表示這個意思了。
我不知道,sql的執行機制是怎樣的,沒有深入學習數據庫,我基本停留在增刪改的階段。所以也不知道像上面的一條語句,是不是要么成功要么失敗的,類似事務的處理結果。
我的傾向應該是要么成功,要么失敗的。
要不然判斷的時候,i==想要執行的數據個數,這樣就太麻煩了。而且很多業務是不知道要執行的數據個數的,此時在執行update和delete語句之前先查出來有多少條數據,就更麻煩了,一大堆的問題。
我冒死去Q群去問這個問題,結果只是被鄙視了好多次而已,道理也說了一大堆,然后就是自己去體會吧之類的話了。然並卵,我也不知道問誰了,又不認識這方面的專家,雖然這個是個那么不起眼的問題。
-------------------------------------------------------------------------------------
哦,有一個是可以確定的,就是在C#執行方法的sql語句參數里,寫上兩條sql語句,比如"update TableA set AID=2 where ID=3;delete TableB where ID=3;"。返回受影響行數>0判斷為成功,顯然是錯誤的。
這里推薦用事務,但用事務的時候可以兩條語句合起來寫,但判斷的時候i==2即可,否則回滾。