Visualizzazione dei risultati da 1 a 9 su 9

Discussione: dataset o dataReader?

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    6

    dataset o dataReader?

    Devo creare una Web application e prelevare dati da un database.
    Conviene utilizzare la modalità disconessa (dataset) o quella connessa(dataReader)?
    Il libro della Microsoft "VB.NET" consiglia di utilizzare il dataset per le applicazioni client-server (windows form) che interrogano un DB su un server di rete ed utilizzare la modalità disconnessa per le applicazioni ASP.NET e, più in generale per tutti gli ambienti privi di stato, in quanto un apagina ASP.NET ha un ciclo di vita piuttosto breve, giusto il tempo necessario per rispondere ad una richiesta del browser, pertanto non ha molto senso creare un dataset per leggere i dati da un DB, inviare i dati all'utente tramite HTML e distruggerlo subito dopo.
    altri libri invece sostengono il contrario.
    Qualcuno mi aiuta? :gren:

  2. #2
    Sono assolutamente daccordo con della Il libro della Microsoft "VB.NET". Cerca di usare il DataReader il più possibile, specie se si tratta solamente di estrarre dati da un DB.

    Il DataSet potrebbe tornarti utile nel caso dovessi unire una tabella con fonti dati diverse ad esempio un file XML e un dataBase...Oppure nel caso ti trovassi a gestire relazioni molto complesse.

    Tieni presente che un dataset deve pur essere memorizzato da qualche parte no? Moltiplica queste risorse per i vari utenti che si collegano alla pagina...La richiesta di risorse comincierebbe a farsi consistente con un elevato traffico...

    Da parte mia posso dirti di sfruttare il dataReader il più possibile

    Ciao


    Marco

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    6
    per quanto riguarda le query di insert dovrei utilizzare allora il comando OleDbCommand senza ricorrere ai dataset?

    scusa se ne approfitto, ma vorrei chiederti ancora un'altra cosa.
    Come DBMS utilizzo SQL Server. Per gestire le autenticazioni, psso memorizzare la password e lo username di un utente in un campo del DB oppure posso creare gli utenti in Sql Server e utilizzare queste password?
    Spero sia chiaro.

  4. #4

    Re: dataset o dataReader?

    Le differenze tra il datareader e il dataset sono paragonabili a quelle tra un grande magazzino e un cassetto di una scrivania. Il datareader lo usi tutte le volte che devi visualizzare una serie di record come quando devi ad esempio popolare una combobox. Se devi attaccarti al db solo per fare questo non ha molto senso ricorrere ad un dataset. I record che visualizzi con il datareader puoi solo scorrerli dal primo all'ultimo (forward only) e visualizzarli. Non e' neanche paragonabile al precedente recordset visto che non presenta metodi del tipo movenext o moveprevious.
    Il dataset invece e' una rappresentazione in memoria del database. E' capace quindi di ospitare al suo interno una o piu' tabelle con tutte le relazioni e vincoli esistenti. In piu' ha altre possibilita' come quella di interagire facilmente con fonti dati xml (lui stesso e' un insieme di schemi e dati xml).
    Nella scelta di quale tecnica utilizzare credo che se da una parte il datareader possa sembrare la strada migliore dall'altra potrebbe essere inutile attaccarsi ogni volta al db per prendere i dati (che magari cambiano raramente) quando potresti farlo una volta, metterli in una datatable e piazzare la datatable nella cache. Non e' infatti necessario utilizzare il dataset se non hai bisogno delle sue varie funzioni ma puoi ricorrere ad una piu' semplice datatable che potrai associare ad una dataview per filtrare o ordinare i dati.

    Per quanto riguarda "lo stato" delle pagine web, con asp.net si e' cercato di superarne la mancanza dando a tutti i controlli asp.net la possibilita' di ricordarselo e quindi in definitiva non e' che sei costretto ad utilizzare ogni volta che l'utente clicca sulla pagina la datatable ma puoi usarla solo la prima volta dopo di che il controllo mantiene i dati caricati.
    Saluti a tutti
    Riccardo

  5. #5
    Originariamente inviato da marco81
    per quanto riguarda le query di insert dovrei utilizzare allora il comando OleDbCommand senza ricorrere ai dataset?
    scusa se ne approfitto, ma vorrei chiederti ancora un'altra cosa.
    Come DBMS utilizzo SQL Server.
    Se utilizzi sqlserver sarebbe meglio utilizzare il namespace system.data.sqlclient e quindi un sqlcommand. E' stato creato appositamente per sqlserver ed e' molto piu' performante.
    Per gestire le autenticazioni, psso memorizzare la password e lo username di un utente in un campo del DB oppure posso creare gli utenti in Sql Server e utilizzare queste password?
    Spero sia chiaro.
    Buona la prima. La seconda potrebbe farti commettere l'errore di utilizzare una connection string per collegarti al db diversa per ogni utente perdendo cosi' i benefici in termini di prestazioni e carico sul dbserver del connection pooling.
    Saluti a tutti
    Riccardo

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    6

    datasetv o datareader

    L'applicazione che devo creare è un sistema che gestisca test o quiz.
    Il docente può creare dei quesiti e poi il sistema sotto la supervisione del prof genera una serie di verifiche(collezione di verifiche) che saranno svolte dagli studenti.
    Conviene quindi utilizzare la modalità connessa o i dataSet?
    Premetto che non opero con file XML.


    Per quanto riguarda le autenticazioni di SQL Server (creo 2 gruppi, uno degli studenti ed uno dei docenti all'interno dei quali saranno memorizzati gli utenti), ho pensato di utilizzarle per ragioni di scurezza, poichè le pwd sono criptate.
    Non sono molto esperto , ma non si potrebbe utilizzare la stesssa connction string per collegarti al db uguale per ogni utente e richiamare poi le pwd tramite delle stored procedure di sistema?
    Spero di non aver detto qualche cretinata.

  7. #7

    Re: datasetv o datareader

    Originariamente inviato da marco81
    Conviene quindi utilizzare la modalità connessa o i dataSet?
    Non credo che la scelta se utilizzare la modalita' connessa o disconnessa precluda o meno l'utilizzo del dataset. Credo pero' di non aver capito bene cosa intendi per modalita' connessa. Se intendi che ad ogni scelta dell'utente la risposta la devi sempre e comunque leggere dal db, allora ti consiglio di evitarlo quando possibile utilizzando un oggetto session dove mettere un elenco di recor e restituire al controllo che deve visualizzare una vista filtrata sull'elenco dei record.

    es.
    hai una datagrid che deve visualizzare dei record. Nella proprieta' datasource della datagrid metti un riferimento ad una funzione o proprieta' che restituisce la fonte dati.
    codice:
    public function Elenco() as dataview
    dim m_dt as datatable 
    dim m_dv as dataview 
    if session("dt") is nothing = true then
    bindElenco()
    end if
    m_dt = ctype(session("dt"), datatable)
    m_dv = new dataview(m_dt)
    ' qui puoi impostare un filtro
    ' es. m_dv.rowfilter = "ID = " & txtID.text 
    return m_dv
    end function
    
    private sub bindElenco
    dim m_dt as datatable
    ' qui metti il codice per 
    ' popolare la tabella con i dati da visualizzare
    ' e quando e' pronta mettila nella session
    session("dt") = m_dt
    end sub
    ...dimenticavo... qui ho usato un oggetto session per memorizzare la fonte dati e non andarla a chiedere ogni volta al db (quando ne hai bisogno puoi comunque chiamare direttamente bindElenco). Invece della session puoi utilizzare altre tecniche di caching dei dati meno onerose per il server come ad esempio l'oggetto cache. Ti invito quindi ad approfondire l'argomento perche' se ti appresti a sviluppare web application con asp.net e' fondamentale.
    Per quanto riguarda le autenticazioni di SQL Server (creo 2 gruppi, uno degli studenti ed uno dei docenti all'interno dei quali saranno memorizzati gli utenti), ho pensato di utilizzarle per ragioni di scurezza, poichè le pwd sono criptate.
    Non sono molto esperto , ma non si potrebbe utilizzare la stesssa connction string per collegarti al db uguale per ogni utente e richiamare poi le pwd tramite delle stored procedure di sistema?
    Spero di non aver detto qualche cretinata.
    Non posso esserti molto utile sull'autenticazione basata su sqlserver. Quello che posso consigliarti e' di scegliere un altro metodo. A te serve un'autenticazione a livello applicativo quindi ti consiglio di utilizzare i metodi offerti dal framework basati sulle informazioni di windows (es. info sull'utente presenti in active directory) oppure su dati presenti in un database. Su questo argomento se non sbaglio c'e' un thread "Autenticazione" aperto da poco dove si parla di alcuni oggetti che possono essere utilizzati per l'autenticazione. Per quanto riguarda la sicurezza sul db, ti consiglio di creare un utente utilizzato dalla tua applicazione web ed usare sempre lo stesso stando attento a dove metti i dati della connection string e magari criptando la password.
    Saluti a tutti
    Riccardo

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    6
    Grazie del prezioso aiuto.
    Che cosa intendi per creare un utente utilizzato dalla tua applicazione web ed usare sempre lo stesso stando attento a dove metti i dati della connection string e magari criptando la password.?
    Dovrei forse creare un utente studente ed uno docente e trattarli come gruppi?


    Nella subroutine bindElenco(), la tabella la popolo tramite dataset oppure posso ricorrere al dataReader ed ogni dato lo memorizzo nella dataTable?

    Grazie ancora

  9. #9
    Originariamente inviato da marco81
    Che cosa intendi per ....zip
    Dovrei forse creare un utente studente ed uno docente e trattarli come gruppi?
    Per collegarti ad un ms sql-server hai bisogno di una connection string con cui inizializzare un oggetto sqlconnection. La connection string e' fatta di poche cose... due di queste cose sono username e password. Non c'e' bisogno in sqlserver di definire due utenti. Basta che ne definisci uno e inserisci username e password in una connectionstring che utilizzi per inizializzare l'oggetto sqlconnection nella tua applicazione. Userai quindi sempre la stessa connectionstring e quindi lo stesso utente ms sql-server. Questa connection string per comodita' puoi inserirla in un file esterno al codice della tua applicazione. Di solito si usa il file web.config (se usi visual studio ti viene creato quando crei un nuovo progetto asp.net). La sintassi e' semplice anche se ora non la ricordo a memoria troverai comunque molti esempi su come la devi scrivere nel web.config e che comandi usare nel codice per leggerla.
    Nella subroutine bindElenco(), la tabella la popolo tramite dataset oppure posso ricorrere al dataReader ed ogni dato lo memorizzo nella dataTable?
    naaa... nell'esempio che ti ho riportato, ho utilizzato una datatable per evitare di farti istanziare un dataset (che e' un oggettino un po' ingombrante). Se segui la strada che ti ho indicato, il datareader te lo puoi scordare. Devi approfondire la conoscenza su ado.net perche' e' un punto centrale di tutto lo sviluppo. Se vai avanti nello sviluppo di una applicazione che usa database senza avere una base teorica su ado.net rischi di perdere molto tempo a riscrivere codice man mano che scopri le varie tecniche e funzionalita'.
    Per sintetizzare al massimo il discorso, ne il dataset ne la datatable ne il datareader posseggono metodi capaci di attaccarsi al database e riempirsi di records. Questi tre oggetti li puoi considerare come dei contenitori. L'imbuto che userai per versarci dentro l'olio... emh i records :gren: e' un sqlcommand (oppure se usi oledb un oledbcommand). Ricapitolando hai bisogno in sequenza di:
    - una connection string
    - un oggetto di tipo sqlconnection
    - un oggetto di tipo sqlcommand
    - un oggetto di tipo dataadapter
    - una datatable
    Dovresti fare qualcosa del tipo:
    codice:
    dim m_connectionstring as string = "stringa di connessione"
    dim m_sqlConn as sqlconnection
    dim m_sqlCmd as sqlcommand
    dim m_dap as dataadapter
    dim m_dt as datatable
    m_sqlconn = new sqlconnection(m_connectionstring)
    m_sqlCmd = m_sqlConn.createcommand
    m_sqlCmd.commandtype = text
    m_sqlCmd.commandtext = "SELECT * FROM tuatabella"
    m_dap = new dataadapter
    m_dap.selectcommand = m_cmd
    m_dt = new datatable
    m_dap.fill(m_dt)
    a questo punto nella datatable ci sono tutti i record della tuatabella senza bisogno di dataset. Naturalmente se dovessi aver bisogno di relazionare la tabella con un altra tabella puoi sempre istanziare un dataset, metterci dentro le due tabelle e aggiungere una datarelation ma questo e' un altro discorso.
    Il codice che ho scritto (cosi a memoria senza correzione automatica :adhone: ) e' nella forma piu' lunga in modo da rendere piu' chiaro il meccanismo. Con un po' di pratica si puo' abbreviare di diverse righe (es. quando istanzi il dataadapter potresti mettere direttamente tra parentesi la select sql e la connection).
    Saluti a tutti
    Riccardo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.