我糾結的sql返回受影響行數與判斷是否成功的問題


比如: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即可,否則回滾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM