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"});
最初の2つのテーブルは正常に実行されますが、3番目のテーブルではスタックし、アプリケーションは永久に実行されます...
面白いことに、「GROUP_REPORT_EMAIL_LIST」と「GROUP_EQUIPMENT_GROUP_STN_XREF」を切り替えると、アプリケーションは2番目のテーブル名にヒットした後も永久に実行されます。
したがって、結論として、関数は「GROUP_EQUIPMENT_GROUP_STN_XREF」に達すると永久に実行されます。生成されたSQLが、ヒキガエルでテストして機能することを確認しました。
他の誰かがこの問題に遭遇しましたか?
編集-最初の2つのテーブルは、実行時に実際にクリアされます。
解決
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は非常に優れたソリューションでしたが、私にはそうする特権がありません。