Possibile un ritorno economico impedire un uso dichiarazione di chiusura di una connessione a un database?

StackOverflow https://stackoverflow.com/questions/588396

Domanda

Quando io sono la creazione di tabelle temporanee ricevo un messaggio di errore che mi dice che la temp tabella esiste già.La tabella temporanea è unica sessione, in modo che sembra che la mia connessione non corretta chiusura e penso che potrebbe avere qualcosa a che fare con un ritorno economico che ho nella mia istruzione.

Ho il seguente codice:

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}

Io uso questo tipo di codice in diversi luoghi per creare una tabella temporanea con lo stesso nome.

Purtroppo, ricevo il seguente errore: There is already an object named '#MyTempTable' in the database.

Ora, so che la temp tabella è unica, per la sessione e quindi una volta che la sessione è chiusa dovrebbe scomparire.

Ci sono tre cose che, credo, potrebbe causare questo...

  1. Ho bisogno di connessione della chiamata.Close()
  2. Ho bisogno di mettere l'istruzione return di fuori della mia istruzione
  3. Ho bisogno di far cadere la temp tabella che ho creato prima di tornare

Qualcuno sa quale è?o se è qualcosa di cui non ho pensato?

È stato utile?

Soluzione

Sto indovinando qui, ma verificare le impostazioni del pool di connessioni di database. Provare a girare pooling fuori e vedere se aiuta.

Di solito, quando si chiude / smaltire il collegamento a livello librerie .NET, connessione al server vero e proprio database non è chiuso. E 'appena tornato al pool di connessioni all'interno fornitore di dati e sarà riutilizzato quando il programma richiede un altro collegamento con gli stessi parametri e le credenziali. Non credo sessione di database viene ripristinato in alcun modo prima di essere restituito al pool, salvo le operazioni aperte e forse alcuni parametri di base. gli oggetti più costosi, come le tabelle temporanee, sono lasciati soli.

È possibile attivare il pool off (molto inefficiente). Oppure si può controllare la tabella temporanea esistenza prima di provare a crearlo e cancellare il suo contenuto, se esiste. Oppure si può cadere tabella temporanea prima di chiudere la connessione.

Altri suggerimenti

Sono abbastanza sicuro che connection.Dispose () (e quindi connection.Close () così) saranno chiamati.

È possibile verificare che abbastanza semplice eseguendo 1) e 2) e controllando che il problema esiste ancora. La soluzione è probabilmente 3) e la spiegazione sarebbe pool di connessioni.

A meno che non si verifica un ciclo di alimentazione o di qualche altra grave bizzarro caso d'angolo dispose sarà chiamato.

Se volete una prova avvolgere l'oggetto e mettere un punto di interruzione.

Un blocco utilizzando viene tradotto in un try / catch / blocca infine sotto il cofano. Sì, disporrà a prescindere dal ritorno all'interno del blocco utilizzando.

No, connection.Close sarà sempre chiamata perché internamente con lo mette in un try / finally.

È inoltre può prendere in considerazione il pool di connessioni. Provare avvolgendo il codice in un TransactionScope.

Per rispondere alle vostre domande:

  1. L'istruzione using sarà implicitamente chiudere la connessione, quando il metodo Dispose della connessione viene chiamato.
  2. Non dovrebbe essere necessario: http://aspadvice.com/blogs/name/archive/2008/05/22/Return-Within-a-C_2300_-Using-Statement.aspx
  3. Provalo.

istruzione using disporrà l'oggetto se sua classe è IDisposable anche lì è una dichiarazione di ritorno all'interno del blocco utilizzando.

E 'il pool di connessioni che mantiene il vostro #temptable, si potrebbe desiderare di abbandonare quel tavolo manualmente.

Senza sapere di più circa la connessione al database biblioteca in uso, direi che non è né dei primi due; using è stato introdotto appositamente per rendere la pulizia di tali risorse più facile quando tornava metodi;direttamente analoga a un normale try...finally blocco in Java o simili.

In altre parole, il return lascerà il blocco e la Dispose metodo verrà chiamato sulla connessione, che dovrebbe, assumendo un sano attuazione di tali, chiamare il Close metodo come parte di questo processo.

Il punto chiave qui è "sano di mente attuazione".

E 'causato dal pool di connessioni. Avvolgere cosa si sta facendo in una transazione e rollback alla fine. In alternativa, eliminare la tabella temporanea dopo che popolano i ds.

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