OracleCommand命令,ExecuteNonQuery问题

我必须清除oracle数据库中的某些表,但是当我遇到运行以下代码的问题时

public static void ClearDataTables(IList 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 { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"}); 

它可以很好地运行前两个表,但是在第三个表上,它会卡住,应用程序会永远运行…

有趣的是,当我切换“GROUP_REPORT_EMAIL_LIST”和“GROUP_EQUIPMENT_GROUP_STN_XREF”时,应用程序在它命中第二个表名后永远运行。

总而言之,该函数在遇到“GROUP_EQUIPMENT_GROUP_STN_XREF”时会永远运行。 我已经validation了生成的SQL是通过在toad上测试它来实现的。

其他人遇到过这个问题?

编辑 – 前两个表确实在运行时被清除。

 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本来是一个非常好的解决方案,但我没有这样做的权限!

您是否忘记在Toad(或任何其他客户)中进行更改? 开放交易将使其无限期等待。

该表中有很多数据吗? 这可以解释为什么删除数据需要这么长时间。
无论如何,我建议使用TRUNC清除表格。

大量删除可能非常慢,特别是如果您在一个事务中运行它们。 如果您根本不需要交易,请使用:

 truncate table YourTable 

如果这样做,请将delete拆分为小型事务。 基本上运行:

 delete from YourTable where rownum < 100 

直到桌子是空的。 请参阅此博客文章 。

我可能会编写一个存储过程来执行所有删除或截断并调用SP一次,而不是有一个循环客户端。

编辑:最好不要在循环内创建命令对象。 使用table-name参数在循环外创建一次,然后调用它为每次迭代提供不同的参数值。 但SP应该是首选。