OracleCommand命令,ExecuteNonQuery问题
我必须清除 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”时,该函数将永远运行。我通过在 Toad 上进行测试来验证生成的 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 本来是一个非常好的解决方案,但我没有这样做的权限!
I have to clear certain tables in the oracle database however when I'm having issues with running the following code
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();
}
}
I am calling this method with this list
ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"});
It runs the first two tables fine, however on the third one, it gets stuck and the application runs forever...
Funny thing is, when I switch "GROUP_REPORT_EMAIL_LIST" and "GROUP_EQUIPMENT_GROUP_STN_XREF"
The application runs forever after the it hits the second table name.
So in conclusion, the function runs forever when it hits "GROUP_EQUIPMENT_GROUP_STN_XREF". I've verified that the SQL generated works by testing it out on toad.
Anyone else ran into this issue?
EDIT - The first two tables does indeed get cleared when it runs.
Solution
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 would have been a very nice solution, however I do not have the privileges to do so!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您是否忘记在 Toad(或任何其他客户端)中提交更改?开放的事务将导致它无限期地等待。
Have you forgotten to commit your changes in Toad (or any other client)? An open transaction will cause it to wait indefinitely.
该表中有很多数据吗?这可以解释为什么删除数据需要这么长时间。
无论如何,我建议使用
TRUNC
来清除表。Is there a lot of data in that table? This would explain, why it takes so long to delete the data.
Anyway, I suggest to use
TRUNC
for clearing tables.大量删除可能会非常慢,尤其是在一个事务中运行它们时。如果您根本不需要该事务,请使用:
如果需要,请将
删除
拆分为小型事务。基本上运行:直到表为空。例如,请参阅此博客文章。
Large number of deletes can be very slow, especially if you run them in one transaction. If you don't need the transaction at all, use:
If you do, split the
delete
over small-sized transactions. Basically run:until the table is empty. See for example this blog post.
我可能会编写一个存储过程来执行所有删除或截断并调用 SP 一次,而不是在客户端循环。
编辑:最好不要在循环内创建命令对象。使用表名参数在循环外部创建它一次,然后调用它,并在每次迭代时为其提供不同的参数值。但SP是首选。
I would probably write a stored procedure that does all of the deletions or truncations and invoke the SP once, rather than have a loop client-side.
EDIT: It would also be better not to create the command object inside the loop. Create it once outside the loop with a table-name parameter, and then invoke it feeding it a different parameter value with each iteration. But the SP is to be preferred.