Domanda

Devo cancellare alcune tabelle nel database Oracle, tuttavia quando ho problemi con l'esecuzione del codice seguente

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();
            }
        }

Sto chiamando questo metodo con questo elenco

ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"});

Esegue bene le prime due tabelle, tuttavia al terzo, si blocca e l'applicazione funziona per sempre ...

La cosa divertente è che quando cambio "Group_report_email_list" e "group_equipment_group_stn_xref" L'applicazione funziona per sempre dopo che ha colpito il secondo nome della tabella.

Quindi, in conclusione, la funzione funziona per sempre quando colpisce "Group_Equipment_Group_stn_xref". Ho verificato che il SQL ha generato funzionano testandolo su Toad.

Qualcun altro ha riscontrato questo problema?

Modifica: le prime due tabelle vengono effettivamente cancellate quando funziona.

Soluzione

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();
            }

Il troncato sarebbe stato una soluzione molto bella, tuttavia non ho i privilegi per farlo!

È stato utile?

Soluzione

Hai dimenticato di commettere le tue modifiche in Toad (o in qualsiasi altro cliente)? Una transazione aperta lo farà aspettare indefinitamente.

Altri suggerimenti

Ci sono molti dati in quella tabella? Ciò spiegherebbe, perché ci vuole così tanto tempo per eliminare i dati.
Comunque, suggerisco di usare TRUNC per la cancellazione delle tabelle.

Un gran numero di eliminazioni può essere molto lento, soprattutto se le si esegue in una transazione. Se non hai bisogno della transazione, usa:

truncate table YourTable

Se lo fai, dividi il delete su transazioni di piccole dimensioni. Fondamentalmente Run:

delete from YourTable where rownum < 100

Fino a quando il tavolo è vuoto. Vedi ad esempio questo post sul blog.

Probabilmente scriverei una procedura memorizzata che esegue tutte le eliminazioni o tronchi e invocherei una volta, piuttosto che avere un lato client a loop.

EDIT: sarebbe anche meglio non creare l'oggetto di comando all'interno del loop. Crea una volta al di fuori del ciclo con un parametro del nome da tabella, quindi invocarlo alimentando un valore di parametro diverso con ogni iterazione. Ma l'SP deve essere preferito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top