Accesso ai dati e visualizzazione in Datagrid

domenica 10 settembre 2006 - 22.52

ricky Profilo | Junior Member

Ciao a tutti, vorrei capire come accedere ai dati utilizzando .NET 2.0

Mi spiego meglio: in .NET 1.1 crevo un DataSet e lo usavo come sorgente per un datagrid...
in .NET 2.0 c'è qualche soluzione migliore o piu performante?

Grazie

mirio Profilo | Newbie

Per uso domestico vanno bene gli xxxxxDataSource:

- AccessDataSource ' che non funziona quasi mai gli update se usi la concorrenza ottimistica
- SqlDataSource

Oppure Aggiungi un dataset che trovi tra i nuovi item e crea un ObjectDataSource

con gli ObjectDataSource puoi sbizzarirti.
Se ti interessa approfondire fammi sapere. (Ma e' difficile da implementare a doc)

Sono poco in rete ma vedro di darti una mano nel caso...

totti240282 Profilo | Guru

>Per uso domestico vanno bene gli xxxxxDataSource


bè dai i datasource nn sono mica cosi poco potenti...se utilizzati a dovere ci si fanno parecchie cosette.
C'è solo un capitano !!!!!!

ricky Profilo | Junior Member

Grazie a tutti per l'interessante discussione... quindi per un uso "non domestico" o cmq per una web application che dovrà gestire parecchi dati (pochi dati da parte di molti utenti) che strutture dati mi consigliate di utilizzare??

Grazie ancora!

mirio Profilo | Newbie

> quindi per un uso "non domestico" o cmq per una web application che dovrà gestire parecchi dati (pochi dati da
> parte di molti utenti) che strutture dati mi consigliate di utilizzare??

La scelta non dipende dalla quantita di dati .

> web application

Bene quindi molti o comunque piu' utenti connessi,
magari che aprono contemporaneamente lo stesso record = "concorrenza ottimistica".

Poi diciamo la che sorgente dati puo cambiare oggi uso mssql domani magari devo usare mysql o oracol o db2.

Poi come dice giustamente Coach : "> o ancora meglio crearti delle tue entità con l'utilizzo dei generics"
Si le entità servono ma se non ti crei prima una struttura decente di interfacce ( interface ) diventa comunque
pesante quando fai grossi lavori.

In pratica ti consiglio di cercare dei BusinessEntity tipo dOOdads(semplice se usi mygeneration), Gentle.NET(dificilino da implementare).


A mygeneration e' un generatore di codice dedicato appunto per i BusinessEntity.
pultroppo per il framework 2 e' in beta e se non scrivi gli scripts in script.net non funziona.
dico questo perche' solo pochi esempi banali sono i script.net gli altri sono in vbscript e javascript.



Quindi devi conoscere prima di tutto :

1. "concorrenza ottimistica"
2. "entità (BusinessEntity)"
3. "objectDataSource per usare le entity"

Ciao.

ricky Profilo | Junior Member

Preferirei non utilizzare strumenti esterni e cmq penso (e spero) di non cambiare DBMS.... resterà SQL Server Express 2005.

Potresti dirmi come gestire correttamente l'accesso ai dati e la visualizzazione in una GridView? Non chiedo questo per "avere il lavoro già fatto", ma semplicemente per capire se la logica che adottavo in .NET 1.1 è corretta e, sopratutto, se è corretta per una web application che verrà utilizzata da un elevato numero di utenti....

Allego la logica che ho sempre usato in 1.1


Nel pageload


if (!IsPostBack)
{
BindGrid();
}



protected void BindGrid()
{
GetData();

// Imposto l'ordinamento presente nel ViewState
if (ViewState["Order"] != null)
{
DsDati.Tables["Elenco"].DefaultView.Sort = ViewState["Order"].ToString();
}

// Imposto il filtro presente nel ViewState
if (ViewState["LastFilter"] != null)
{
DsDati.Tables["Elenco"].DefaultView.RowFilter = ViewState["LastFilter"].ToString();
}


MyDataGrid.DataSource = DsDati.Tables["Elenco"].DefaultView;
MyDataGrid.DataBind();
}




private void GetData()
{
try
{
DsDati = new DataSet();
dbconn.Open();
SqlCommand myCommand = new SqlCommand("SP_Prova", dbconn);
myCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter DataAdatp = new SqlDataAdapter(myCommand);
DataAdatp.Fill(DsDati, "Elenco");
dbconn.Close();
}

catch (Exception exc)
{
string debug = exc.Message;
}

}



protected void Sort_Grid(Object sender, DataGridSortCommandEventArgs e)
{
GetData();
DataView dv = DsDati.Tables["Elenco"].DefaultView;


// quando effettuo l'ordinamento recupero anche il filtro applicato al DataView
if (ViewState["LastFilter"] != null)
{
DsDati.Tables["Elenco"].DefaultView.RowFilter = ViewState["LastFilter"].ToString();
}

dv.Sort = e.SortExpression.ToString();

ViewState["Elenco"] = dv.Sort;

MyDataGrid.DataSource = dv;
MyDataGrid.DataBind();

}



Considerando che in .NET 1.1 usato il DataGrid e non la GridView (che mi sembra sia stata introdotta in .NET 2.0), posso utilizzare la stessa logica anche per la GridView oppure la mia soluzione non è "ottimale"??

Grazie a tutti!

ricky Profilo | Junior Member

Grazie per tutte le info! Ma la mia modalità di accesso ai dati è corretta?? Anche per una mole di dati elevata?? (pochi dati da parte di molti utenti???) ... intendo l'uso di DataSet non tipizzato, il command, il dataadapter ecc....

Grazie mille

mirio Profilo | Newbie

Non ho capito il problema degli strumenti esterni

Parli dei dataset come se fosse l unica fonte dati che conosci personalmernte non li uso.

Poi visto che vuoi sviluppare in asp.net 2 sfrutta i nuovi datasource hanno fatto un buon lavoro alla ms usiamoli

Un consiglio poi fai te, non vuoi usare componenti esterni fatti un data entry decente che potrai
potenziare di volta in volta.

Comunque visto che diffidi dei componenti esterni ti faccio un esempio di dOOdads modificato da me per usare datatable typizzati:

Primo uso mygeneration in cui ho modificato degli script esistenti per usare ObjectDatasource per creare in un solo click:
Le stored procedure.
Due classi una base (vedi codice 1) , una di implementazione (2) dove poi magari aggiungo altri metodi che so una query (3), e il datatable (4) identico ha un dt generato da il generatore di vs.

Per personalizzarlo ho impiegato una settimana 2 ore a sera pero' adesso quando devo gestire una nuova tabella apro mygen.. scelgo la tabella e ho quanto descritto sopra (gia ma e' meglio non usare i componenti esterni) .

Ciao.

1:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

2:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

3:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

4:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ricky Profilo | Junior Member

Prima di tutto grazie per la risposta.

Be con l'esempio che mi hai fatto ....diciamo che la mia decisione di non utilizzare componenti esterni è legata soprattutto ad un discorso economico.... se ci fossero tool free sarebbe tutto diverso

Quindi a questo punto mi trovo davanti ad una decisione del tipo:

Esistono buoni componenti free??
Uso solo .NET 2.0... e al posto dell'odiato DataSet... cosa posso usare? (quali sarebbero i nuovi datasource)


Thanks

mirio Profilo | Newbie

Io parlo di componenti free
Ricordati che io l ho modificato il dOOdads

comuque provalo

http://www.mygenerationsoftware.com

Ciao

ricky Profilo | Junior Member

Lo sto installando e provando.... grazie per il suggerimento!

Ma tu che genere di modifiche/personalizzazioni hai fatto? (potresti farmi un esempio)

Ma quindi, riassumendo, utilizzando questo prodotto cosa "non dovrei utilizzare" della mia precedente modalità di gestione???

Ora mi leggo un po' di documentazione!

Grazie

mirio Profilo | Newbie

le modifiche che ho apportato mi permettono di usare datatable tipizzati solo per la comodita' del design.

Comuqnue un paio di dritte senno ci stai un mese solo per capire da dove iniziare.

Prima di continuare ......
Se usi la versione per framework 2 (in caso di errore "Void AddCode(System.String)" devi convertire lo script in script.net
Lo so e' una palla pero' la versione 2 e' in beta.

In MyGENERATION setta il db di default poi apri le template sotto Microsoft SQL Server
usa :
dOOdad Stored Procedures, e Script Insert/Update/Delete Procedures for SQL Server.

in C:\Programmi\MyGeneration\Architectures\dOOdads trovi la lib di base per il codice generato.

il codice generato io lo metto in una lib poi aggiungo un riferimento a dOOdads.

>Ma quindi, riassumendo, utilizzando questo prodotto cosa "non dovrei utilizzare" della mia precedente modalità di gestione???
Usa tutto cio che velocizza e migliora in stabilità il prodotto.
Ciao.


ricky Profilo | Junior Member

Quindi riassumendo:

configuro mygeneration
imposto la connessione sul mio DB, mapping language: C#, target mapping: SQL Client
in template non modifico nulla

eseguo mygeneration... a questo punto??

Grazie per l'aiuto

mirio Profilo | Newbie

Volevo riponderti : "A questo punto selezioni tra i template di mygeneration per primo da Mssql ecc.", poi mi sono accorto che ci mettevo di piu' a spiegarti che a farlo (visto che le versioni dei template che distribuiscono non girano su mygen per net 2 beta).

Ti ho riscritto i template in Vb.NET (fattibile anche in C# ma troppo lunga la conversione)

template per creare le storedProc su db (in allegato):

Crea cartella 'smdev' in C:\Programmi\MyGeneration\Templates\
Etrai gli allegati dentro 'smdev'

Ora tra i template Hai una cartella smdev contenete :

- dOOdad MSSQL Stored Procedures
- dOOdads code Generate Bussiness Entity

La prima genera gli scripts SQL delle storedProcedure di base per il doodas
La seconda genera le classi che utilizzerai nella lib che eredita da doodas.

La prima genera i file "nometabella".sql e MicrosoftSQL_ALL.SQL (Cartella "GeneratedCode")
MicrosoftSQL_ALL.SQL contiene tutte le procedure delle tabelle selezionate
ovviamente "nometabella".sql contiene le proc per una delle tabelle.
Carichi gli scripts e hai le stored sul db.

Come spiego sopra la seconda genera le classi ........ (nel linguaggio di output che hai selezionato)
nella cartella C:\Programmi\MyGeneration\Templates\GeneratedCode (se hai lasciato la default della cfg)
trovi i file che rappresentano i tuoi dataentry per le tabelle con i nomi appunto di esse.

Ti allego, anche se credo lo hai gia, il QuickRef di doodas.

Le classi che genera le puoi implementare facilmente per il datasource object .

Vedi precedente post dove c'e' l'esempio (2)

esempio di select:

<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function GetById(ByVal ID As Integer) As IMMOBILIDataTable
Me.LoadByPrimaryKey(ID)
Return CType(Me.DataSet.Tables(0), IMMOBILIDataTable)
End Function

al posto di IMMOBILIDataTable come tipo di ritorno metterai as dataview ( in c# public DataView GetById(....)
e nel corpo " return this.DefaultView "
Naturalmente prima impara come si usa il datasourceobject altrimenti DataObjectMethod(DataObjectMethodType.Select) non sai cosa fartene .

L'unica cosa difficilina nel uso del datasourceobject e la definizione dei mettodi perche' i parametri passati al DataObjectMethod dipendono da se usi la concorrenza ottimistica o no e altri fattori , ma questa e' un' altra storia .

Spero di esserti stato utile.

ricky Profilo | Junior Member

Graaaaaaaazie mille per tutto... mi hai dato una grossa mano, soprattutto per entrare in questo nuovo mondo a me sconosciuto!!!!

Riassumendo io ho fatto:

- Nuovo progetto
- Scelgo il tuo template
- Clicco su "Record Template Input" , la prima volta selezionando SP e la seconda volta selezionando Business entity
- Eseguo il tutto (due volte, una per le SP l'altra per Business), la prima volta ottengo i files del DB (come mi hai dettagliatamente indicato tu), la sconda volta ottengo i files vb


Alcuni dubbi/consigli:
Tu come "Default Namespace" in fase di creazione del code cosa metti? Uno differente da quello dell'applicativo??

I files vb generati li includo in una cartella (Es DAL) del mio progetto (nient'altro??); oppure esiste una soluzione piu "seria"??

Anche se il tuo codice è VB, posso scegliere come output del GeneratedCode, C#?? (lasciando ovviamente "Template language" su VB e mettendo "GUI language" su C# oppure "Output language" su C#?? ... quale dei due devo mettere su C#)

Per quanto riguarda i due files di code creati: il primo contiene tutti i metodi per creare/cancellare/aggiornare la tabella (CRUD), il secondo invece (contiene il datatable tipizzato) alla fine io dovrò, quasi sempre, utilizzare i metodi "già pronti" di quest'ultimo file??

Seguento il tuo consiglio/esempio (se non ho capito male), se io modificassi questo DataObject come da te suggerito
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function GetById(ByVal ID As Integer) As IMMOBILIDataTable
Me.LoadByPrimaryKey(ID)
Return CType(Me.DataSet.Tables(0), IMMOBILIDataTable)
End Function

per ritornare un DataView da usare per il DataSource, vorrebbe dire modificare il codice generato da mygeneration (che ritorna per default un DataTable)
ma a questo punto se, successivamente, apportassi una modifica alla mia tabella del DB e lanciassi nuovamente mygeneration (per aggiornare il code della mia tabella) perderei i miei metodi creati o modificati ...giusto?? tu che soluzione adotti?


Stragrazie ancora!


mirio Profilo | Newbie

Era solo un esempio siccome implementare i datatable tipizzati ti impone di modificare la lib doodas di base che comporta la perdita di eventuali aggiornamenti da parte di mygeneration, ho riscritto uno script che implementa il DataObject ma lo fa su la lib di base cosi che tu potrai fruttarla al meglio l' unica diferenza in fondo e' l'uso designer di vs 2005 non ti fa vedere le boundfield ma le devi definire a mano.


>Tu come "Default Namespace" in fase di creazione del code cosa metti? Uno differente da quello dell'applicativo??

Be io uso questa tecnica :
sm.xxx.yyy sm sta per Salvini Mirio ed e' il namespace di base di tutti i miei progetti.
namespace sm.web.xx xx = ui.webforms ui.usercontrols ecc.
per il dal uso sm.data.xxxx, xxxx in questo caso metto doodas,
quindi in "Default Namespace" metto sm.data.doodas

Ho modificato il template di generazione per creare la classe base per l'implementazioni
in cui devi specificare anche la base del namespace che hai impostato sulla generazione in "Default Namespace"
In allegato trovi il suddetto file template.

Di solito io faccio cosi esempio sm.data.doodas contiene le classi doodas e sm.data.helpers contiene le implementazioni per il dal che vado a costruirmi ess. funzione che ritorna un dataview ecc.
mettendo i file in due namespace diversi ho piu' facilita' nell' uso dell' intellisense.
------------------------------------------------------------------------------------------------------------------------------------------

>I files vb generati li includo in una cartella (Es DAL) del mio progetto (nient'altro??); oppure esiste una soluzione piu "seria"??

Io aggiungo un progetto di libreria, poi creo una cartelle in cui metto i file generati doodas (quelli con _ davanti) ,
nella root del progetto includo i file di implementazione. (quelli senza _ davanti).
In questa libreria definisco tutte le funzioni DAL
------------------------------------------------------------------------------------------------------------------------------------------

>Anche se il tuo codice è VB, posso scegliere come output del GeneratedCode, C#?? (lasciando ovviamente
>"Template language" su VB e mettendo "GUI language" su C# oppure "Output language" su C#?? ... quale dei
>due devo mettere su C#)

Ho allegato un generatore per c#: (Se capisci la logica degli scripts puoi modificarli come vuoi)
dOOdads_code_Generate_Bussiness_Entity_C#.zeus

che genera:
_xxxx le classi base da non toccare ( visto che vengono generate )
mentre le classi xxxx derivano da _xxxx che userai per il le tue funzioni di select insert update ecc. (incluse una sola volta , spunta "Genero le classi di base ?" )
e la classe xxxx_DataObject per il mapping su datasourceobject

Non ho testato niente ho solo verificato che non ci siano exception.
Quindi a te non resta che provare

>per ritornare un DataView da usare per il DataSource, vorrebbe dire modificare il codice generato da mygeneration (che ritorna per default un DataTable)

No non hai capito come funziona ,(ora torna un dataview di base con l'ultimo scripts) , devi essere tu a definire cio che vuoi far "ritornare" che so dataview datareader arraylist ecc.
Doodas ti mette a dispozione un aiuto per facilitare la scrittura del codice.


COMUNQUE NON E' DETTO CHE DEVI USARE PER FORZA IL DATASOURCEOBJECT
SE LEGGI CON ATTENZIONE LA doodadsQuickRef.pdf VEDI CHE E' MOLTO VELOCE SCRIVERE Helpers.
NEL FILE CHE SOPRA CHIAMO xxxx CHE DERIVA DAI FILE GENERATI APPORTI LE TUE MODIFICHE.

N.B.
Dimenticavo,
nel file web.config aggiungi :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e nei progetti in cui usi doodas includi rif. a MyGeneration.dOOdads_2005.dll



Mirio Salvini.
http://www.smdev.eu
info@smdev.eu

ricky Profilo | Junior Member

Grazie per la risposta dettagliata...

Ho provato a scaricare il file ma non è possibile, forse perchè la descrizione che hai messo è troppo lunga??? Potresti allegarlo nuovamente?

Grazie mille!

mirio Profilo | Newbie

Ciao.
Mirio Salvini.
http://www.smdev.eu
info@smdev.eu
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5