2011-03-21 70 views
4

我必須清除某些表在Oracle數據庫然而,當我在與運行下面的代碼的OracleCommand命令的ExecuteNonQuery問題

public static void ClearDataTables(IList<string> tableNames) 
     { 
      string connectionString = "CONNECTIONSTRING"; 
      using (OracleConnection connection = new OracleConnection()) 
      { 
       connection.ConnectionString = connectionString; 
       connection.Open(); 
       foreach (string table in tableNames) 
       { 
        OracleCommand command = connection.CreateCommand(); 
        string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table); 
        command.CommandText = sql; 
        command.ExecuteNonQuery(); 
       } 
       connection.Close(); 
      } 
     } 

我調用此方法與此列表

ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"}); 
問題

它運行前兩個表罰款,但在第三個,它被卡住,應用程序永遠運行...

有趣的是,當我切換「GROUP_REPORT_EMAI L_LIST「和」GROUP_EQUIPMENT_GROUP_STN_XREF「 應用程序在遇到第二個表名稱後永遠運行。

因此,總之,該函數在碰到「GROUP_EQUIPMENT_GROUP_STN_XREF」時永遠運行。我已經驗證過,通過在蟾蜍身上測試它生成的SQL是可行的。

其他人遇到這個問題?

編輯 - 前兩個表確實在運行時被清除。

解決方案

string connectionString = "CONNECTIONSTRING"; 
      using (OracleConnection connection = new OracleConnection(connectionString)) 
      { 
       connection.Open(); 
       OracleCommand command = connection.CreateCommand(); 
       OracleTransaction trans = connection.BeginTransaction(); 
       command.Transaction = trans; 
       foreach (string table in tableNames) 
       { 
        string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table); 
        command.CommandText = sql; 
        command.ExecuteNonQuery(); 
       } 
       trans.Commit(); 
      } 

TRUNCATE將是一個非常好的解決方案,但是我沒有權限這麼做!

+0

任何最終的解決方案與完整的源代碼示例工作呢? – Kiquenet 2013-10-28 08:29:43

回答

8

您忘記了在Toad(或任何其他客戶端)中提交您的更改嗎?一個開放的事務會導致它無限期地等待。

+0

謝謝!這使用交易後很好! – ChickSentMeHighE 2011-03-21 17:32:07

+1

我希望我可以給這個超過1的投票...... – 2011-05-13 14:33:06

+0

每隔幾個月我就浪費一個小時試圖弄清楚一些奇怪的數據庫問題,只有意識到我在蟾蜍中留下了一個未提交的事務。發生在我們最好的人身上! – 2011-05-13 15:03:50

3

該表中有很多數據嗎?這可以解釋爲什麼刪除數據需要很長時間。
無論如何,我建議使用TRUNC清除表。

+0

當使用'trunc'清除表格時,您無法確定OP實際需要的撤消功能是不可用的。 – 2011-03-21 16:42:46

+0

@Mike:如何在'commit'後撤銷'delete'? – 2011-03-21 16:43:58

+0

通過UNDO功能可以完成恢復場景。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14196/storage003.htm – 2011-03-21 16:48:37

3

大量的刪除操作可能非常緩慢,特別是如果您在一個事務中運行它們。如果你不需要交易可言,使用:

truncate table YourTable 

如果你這樣做,對小規模的交易拆分delete。基本上運行:

delete from YourTable where rownum < 100 

直到表爲空。例如見blog post

2

我可能會寫一個存儲過程來完成所有的刪除或截斷,並調用SP一次,而不是有一個循環客戶端。

編輯:最好不要在循環內創建命令對象。使用table-name參數在循環外創建一次,然後在每次迭代時調用它爲其提供一個不同的參數值。但SP是首選。