Per recuperare diversi set di risultati restituiti dalla stored procedure dobbiamo usare questo:
UsersPhonesDBContext.Database.Initialize(force: false);
DbConnection con = UsersPhonesDBContext.Database.Connection;
var cmd = con.CreateCommand();
cmd.CommandText = "[dbo].[SelectPhones]";
con.Open();
var reader = cmd.ExecuteReader();
Phones phones = ((IObjectContextAdapter)UsersPhonesDBContext)
.ObjectContext
.Translate<Phones>(reader, "Phones", MergeOption.AppendOnly).First();
reader.NextResult();
Users users = ((IObjectContextAdapter)UsersPhonesDBContext)
.ObjectContext
.Translate<Users>(reader, "Users", MergeOption.AppendOnly).First();
Ma se la procedura restituisce un singolo set di risultati, possiamo farlo semplicemente con
var phones1 = UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);
senza creare, aprire e chiudere la connessione DB ecc.
Quindi la mia domanda è: perché dobbiamo creare e aprire connessioni se più set ma non per il singolo poiché entrambi sono accessibili dal database.
L'apertura e la chiusura delle connessioni al database sono operazioni costose in termini di tempo e risorse. Allo stesso tempo, se la connessione viene lasciata aperta per un lungo periodo di tempo, potrebbe causare perdite di memoria o rischi per la sicurezza.
Quindi l'approccio raccomandato è quello di aprire la connessione al database solo quando necessario e chiudere non appena viene servito lo scopo di aprirlo.
Nell'esempio che hai condiviso, ci sono più operazioni di database in corso in un colpo solo. Quindi, invece di aprire individualmente la connessione per ogni operazione, viene aperta una sola connessione ed è chiusa una volta completata l'operazione. Qui la connessione viene aperta e chiusa manualmente.
I nuovi approcci dei livelli DataAccess come EntityFramework ecc. Fanno questo lavoro internamente.
UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);
In questa riga di codice, la connessione al database viene aperta e chiusa internamente senza che ci si debba preoccupare di ciò.
Quindi il motivo principale è minimizzare la connessione aprire e chiudere le operazioni e chiudere la connessione non appena lo scopo di aprirlo è finito.