DataSet disconnesso, aggiornamento dati del database

martedì 07 febbraio 2012 - 14.26
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server 2008 R2

CarryFlag Profilo | Newbie

Ciao a tutti,

sto creando un'applicazione in C# (VS 2010) che interagisce con database SQL Express 2008 R2. Nel database ho creato varie stored procedure fra cui quelle di recupero dati per modifica da parte dell'utente in un oggetto DataGridView.

Per il recupero dati ed il legame con il DataGridView nessun problema: ho creato una funzione che apre la connessione al database, richiama la stored procedure relativa, popola il DataSet, chiude la connessione e (finalmente ) torna il DataSet.

public static DataSet GetLinee() { SqlConnection con = new SqlConnection(GetConnectionString()); SqlDataAdapter da = new SqlDataAdapter("GetLinee", con); DataSet ds = new DataSet(); da.SelectCommand.CommandType = CommandType.StoredProcedure; try { con.Open(); da.Fill(ds); con.Close(); } catch (SqlException ex) { System.Windows.Forms.MessageBox.Show(PreparaMessaggioErroriSQL(ex)); ds = null; } con.Dispose(); da.Dispose(); return ds; }

Ora il problema che si presenta è questo: nelle ricerche fatte, gli esempi che ho trovato creano il DataAdapter per il salvataggio utillizzando direttamente uno statement SQL (es. SELECT Colonna1, Colonna2 FROM Tabella), creando l'oggetto SqlCommandBuilder ed infine usando il metodo Update del DataAdapter. Solo che vorrei evitare di gestire statement SQL nel programma, vorrei tenere distinto l'accesso ai dati a "basso livello" dalla gestione intermedia. Inoltre, gestendo anche statement SQL dovrei sempre considerare di riportare eventuali modifiche in due punti (stored procedure nel database e statement SQL nel programma).

Ho tentato di creare il DataAdapter per il salvataggio nello stesso modo in cui genero quello di lettura, ma l'oggetto SqlCommandBuilder non è stato d'accordo al momento dei vari GetInsert/Update/DeleteCommand()

Esiste un metodo per trasferire le modifiche del DataSet al database in modo da evitare lo statement SQL? Oppure è quella la strada e devo mettere da parte le menate di voler tenere distinte le gestioni di cui parlavo prima?

Spero di aver reso l'idea e mi scuso se dovessi aver postato nella sezione non corretta.

Grazie in anticipo,
Davide.

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>Esiste un metodo per trasferire le modifiche del DataSet al database
>in modo da evitare lo statement SQL? Oppure è quella la strada
>e devo mettere da parte le menate di voler tenere distinte le
>gestioni di cui parlavo prima?
Se vuoi usare le funzioni builtin del dataset non credo si possa fare altro che intervenire sui vari command.
prova a vedere qui: http://www.c-sharpcorner.com/UploadFile/dclark/UseSPwithDP11282005035417AM/UseSPwithDP.aspx

detto questo, personalmente ti consiglio di lasciare definitivamente l'approccio dataset/dataadapter. Così dispendioso in termini di risorse..
Perchè invece non fa tu proprio la chiamata alla stored procedure via ado.net in scrittura?
In lettura poi potresti popolare tuoi oggetti, evitando di usare quei pesanti dataset. Alla fine basta che ti scrivi un modello di classi tue e poi le popoli ragionando a list of di tuoi tipi.
Molto più snello e veloce. Che dici?

>Grazie in anticipo,
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

CarryFlag Profilo | Newbie

Ciao Alessandro,

grazie mille per la tua risposta e per il link. Quello che avevo intenzione di fare era consentire all'utente l'edit completo della datagrid e lasciare l'aggiornamento del database agli oggetti .NET

Fortunatamente la parte in questione dell'applicativo non è quella principale, ma quella di manutenzione tabelle da parte di utenti autorizzati e la questione performanca passa (lievemente) in secondo piano.

Comunque credo che accetterò il tuo consiglio e proverò ad implementare liste di classi specializzate con i propri metodi Update() e Delete() che accederanno direttamente a stored procedure ad hoc del database. L'unica cosa è che dovò cercare di gestire per bene edit di cella, creazione/cancellazione di riga mediante gli eventi della datagrid il mio timore è perdermi qualcosa lì in mezzo, non ho mai lavorato con liste dinamiche di questo tipo

Comunque cercherò di fare attenzione!

Ancora grazie mille!
Davide.

alx_81 Profilo | Guru

>Comunque credo che accetterò il tuo consiglio e proverò
>ad implementare liste di classi specializzate con i propri metodi
>Update() e Delete() che accederanno direttamente a stored procedure
>ad hoc del database.
In realtà il modello nella visione che ti dicevo è stateless.. Non farei un'istanza, ma semplici classi che danno la struttura dell'oggetto da passare poi al livello dati, il quale espone metodi per l'aggiornamento dati.
In poche parole, il livello dati condivide il modello del biz e accetta quei tipi per eseguire modifiche a database.

>L'unica cosa è che dovò cercare di gestire
>per bene edit di cella, creazione/cancellazione di riga mediante
>gli eventi della datagrid il mio timore è perdermi qualcosa lì
>in mezzo, non ho mai lavorato con liste dinamiche di questo tipo
non cambia tanto, una volta che hai iniettato il source, dovrai gestire tu gli eventi di edit dei dati, chiamando appunto il tuo strato di biz.

Se la risposta ti è stata di aiuto, ti chiedo di accettarla, così chiudiamo il thread come risolto, grazie.
facci sapere
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

CarryFlag Profilo | Newbie

Ciao Alessandro,

scusa se non ho segnato il thread com chiuso, l'ho scordato . Lo faccio subito.

>In realtà il modello nella visione che ti dicevo è stateless..
>Non farei un'istanza, ma semplici classi che danno la struttura
>dell'oggetto da passare poi al livello dati, il quale espone
>metodi per l'aggiornamento dati.
>In poche parole, il livello dati condivide il modello del biz
>e accetta quei tipi per eseguire modifiche a database.
Ehhhh... ammetto di essermi perso qui!! Se ho capito bene cosa intendi, le classi non dovrebbero esporre alcun metodo di accesso al database, ma sarebbero passate come parametri a funzioni specializzate per interagire con il database?

Grazie mille per il tuo aiuto,
Davide.

alx_81 Profilo | Guru

>Ehhhh... ammetto di essermi perso qui!! Se ho capito bene
>cosa intendi, le classi non dovrebbero esporre alcun metodo di
>accesso al database, ma sarebbero passate come parametri a funzioni
>specializzate per interagire con il database?
bravo, io vedo un modello, che dice solo come sono fatti gli oggetti, le entità, poi vedo il data layer che li consuma.
Me l'hanno insegnato degli sviluppatori coi quali tutt'ora condivido i progetti al lavoro e mi fido

>Grazie mille per il tuo aiuto,
figurati

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5