OracleCommand命令,ExecuteNonQuery问题

时间:2011-03-21 16:37:17

标签: c# sql oracle10g executenonquery oraclecommand

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

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_EMAIL_LIST”和“GROUP_EQUIPMENT_GROUP_STN_XREF”时 应用程序在命中第二个表名后永远运行。

总而言之,该函数在遇到“GROUP_EQUIPMENT_GROUP_STN_XREF”时会永远运行。我已经验证了生成的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本来是一个非常好的解决方案,但我没有这样做的权限!

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

truncate table YourTable

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

delete from YourTable where rownum < 100

直到表格为空。例如,请参阅此blog post

答案 3 :(得分:2)

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

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