首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleCommand命令,ExecuteNonQuery问题

OracleCommand命令,ExecuteNonQuery问题
EN

Stack Overflow用户
提问于 2011-03-22 00:37:17
回答 4查看 15.8K关注 0票数 4

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

代码语言:javascript
复制
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();
            }
        }

我正在使用这个列表调用这个方法

代码语言:javascript
复制
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“时,它将永远运行。我已经通过在toad上进行测试来验证生成的SQL是否正常工作。

还有没有人遇到过这个问题?

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

解决方案

代码语言:javascript
复制
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();
            }

截断将是一个非常好的解决方案,但是我没有这样做的特权!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-22 00:41:49

您是否忘记在Toad (或任何其他客户端)中提交更改?打开的事务将导致它无限期地等待。

票数 10
EN

Stack Overflow用户

发布于 2011-03-22 00:40:49

表中有很多数据吗?这就解释了为什么要花这么长时间才能删除数据。

无论如何,我建议使用TRUNC来清除表。

票数 3
EN

Stack Overflow用户

发布于 2011-03-22 00:46:28

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

代码语言:javascript
复制
truncate table YourTable

如果这样做,那么将delete拆分到小型事务上。基本上就是运行:

代码语言:javascript
复制
delete from YourTable where rownum < 100

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5380688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档