Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Problemino Dataset...

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    75

    Problemino Dataset...

    Ciao raga!
    Ho un problema con i dataset...
    Praticamente la mia SELECT Mi tira fuori 8000 record!
    Ho impostato la paginazione:

    Sub saltapagina(ByVal sender As Object, ByVal e As DataGridPageChangedEventArgs)
    DataGrid1.CurrentPageIndex = e.NewPageIndex
    BindGrid(Me.ViewState("sort"))
    End Sub

    Sub BindGrid(ByVal SortFieldClicked As String)
    Dim quanti As Integer
    Dim DS As DataSet = LoadDataSet()
    Dim sources As New DataView()

    quanti = DS.Tables("Catalogo").Rows.Count.ToString()
    sources = DS.Tables("Catalogo").DefaultView
    sources.Sort = SortFieldClicked
    DataGrid1.DataSource = sources
    DataGrid1.DataBind()
    Me.ViewState("sort") = SortFieldClicked
    lblMessage.Text = "Pagina " & DataGrid1.CurrentPageIndex + 1 & _
    " di " & DataGrid1.PageCount & _
    " - Prodotti trovati: " & quanti & ""
    End Sub

    Private Function LoadDataSet() As DataSet
    Dim DS As DataSet
    DS = New DataSet()
    Dim Test As New Divani.ProductsDB()
    Dim obj_Param As New Divani.ProductParameters()
    obj_Param = fillParam()
    DS = Test.SearchProduct(obj_Param)
    Return DS
    End Function

    In questo modo però ogni volta che clicco su "Pagina Successiva"
    effettuo una nuova QUERY!
    è possibile evitarlo?
    Vorrei caricare il Dataset e poi utilizzarlo senza doverlo ricaricare ogni volta....!

  2. #2
    mi sembra + che legittima la tua richesta

    io ho fatto così

    1) usa un datalist per visualizzare il contenuto, o u repeater, con molti record e parecchie colonne il datagrid ti produce un view state enorme... (che si puo comunque disabilitare)

    1) (vero) hai il tuo dataset e la tua datatable con dentro 8000 record ok ? bene aggiungi una colonna al datatable di tipo auto increment (contatore insomma)

    2) fatti 2 pulsantini con scritto "avanti" "indietro" per la paginazione utilizzando dei button link

    3) utilizza delle comodissime label per indicare pag X di Y

    4) a questo punto il datatable con dentro gli 8000 record + la colonna auto increment lo metti in cache :sexpulp:

    5) crei ora una dataview e i parametri per filtrare sono

    where id >= ... and id <= ....

    6) databindi il tutto
    --------------------------------------------------
    è un nuovo metodo
    me lo sono inventato io, a mè funzia ! poi che figata far andare la paginazione e "spegenre SQL server" :sexpulp:

    ciao

    (stasera c'è il "mio" film !) :gren:
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482
    Chi ha detto che rieffettui la query? Dal codice che hai postato non si capisce un granchè.

    Hey hey, my my Rock and roll can never die!

  4. #4
    infatti nessuno ha detto che rieffettuo la query !

    la faccio una volta sola, poi il datatable con la colonna aggiuntiva lo metto nella cache

    a questo punto si tratta solo di filtrare usando un dataview e prendendo ad esempio a blocchi di 10 dal dataset che ne contiene 8000

    ti dico che mentre scorro la paginazione, per provare se tutto funzionava, ho arrestato il servizio di sql server !!! e funzionava !
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    75

    Ci provo...

    Scusa,per la domanda banale ma non è che sia un vero esperto...
    Supponendo che lascio il datagrid,come inserisco il risultato della query nella cache?
    e ci sono dei metodi per recuperarli???!?!?:adhone:

  6. #6
    ah beh per fare come dico io devi avere un poco di dimestichezza con le operazioni base

    per mettere il dataset in cache devi fare (supponiamo che il dataset di chiami "dst_primo"

    cache("dst_cache")=dst_primo

    in questo modo quando usi "dst_cache" è come se usassi il dataset
    puoi ad esempio fare datagrid1.datasurce=dst_cache

    fai prima un controllo per vedere se dst_cache sia "pieno" o "vuoto"

    if dst_cache is nothing then
    'rifaccio la quesy per riottenere gli 8000 record e aggiungo la
    'colonna auto-increment
    cache("dst_cache")=dst_primo
    else
    vado avanti...
    end if

    il controllo và fatto perchè al primo caricamento della pagina sicuramente la cache non è piena
    le volte dopo, non solo nello scorrere la paginazione non avrai + bisogno di rieseguire la query, ma potresti non averne bisogno anche unscendo e rientrando nella pagina..

    inoltre i dati che hai messo in cache se vengono sfruttati da qualche altra pagina li puoi riutilizzare, sempre facendo il controllo prima.
    NOn è infatti sicuro che il server li mantenga in cache, se le risorse scarseggiano uno o + elementi della chache vengono eliminati(si possono impostare anche priorità ...)

    attenzione al fatto che se quei 8000 record variano molto frequentemente , la cache và gestita a dovere.
    Ad esempio la puoi invalidare , quando compi azioni di modifica su quella tabella di db

    oppure la invalidi all'entrara nella pagina (sub page_load) ma non nei postback

    in questo caso ogni volta che entri i record sono appena stati "tirati sù da nuovi" e la paginazione ti fa vedere questi, se mentre scorri la paginazione accade qualche modifica non te ne accorgi

    hai però il vantaggio di limitare moltissimo le richieste al tuo db, cosa molto importante se i record sono molti e magari anche gli utenti contemporanei
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    75

    ok

    OK ci provo, grazie!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    75

    Ankora...

    Scusa ma i dati vengono salvati nella cache sul server??
    C'è una scadenza,oppure rimangono salvati finchè non li elimino?

  9. #9
    si vengono salvati nella ram del server.
    così quando li richiedi, capisci benissimo che diventano "una scheggia" in velocità

    non è detto però che ci rimangono sempre. Asp.net quando vede che le risorse del server scarseggiano comincia a cancellare roba; come ti dicevo quando inserisci in cache puoi dare delle priorità, fino a quella massiama che dice "non cancellare mai". MA anche quest'ultima per quanto ho letto sul libro, non è da metterci le mani sul fuoco per il motivo che dicevo prima.

    In ogni caso poco male, utilizzando il controllo che già devi fare per forza, (se la cache è vuota allora....), ti sei parato il c..o.
    Appena compili la pagina infatti e la primissima visualizzazione sicuramente non avrai i dati in cache ! e quindi ce li metti

    se poi il server te li cancella poco male , ti rifarai la query, ma intando diverse volte sei andato "gratis"
    ---------------------------------------------------------
    si vabbè ho capito ti posto il codice che ho usato:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub

    Sub bindata()
    If CInt(Label2.Text) = 1 Then
    LinkButton2.Visible = False
    Else
    LinkButton2.Visible = True
    End If
    If Label1.Text = Label2.Text Then
    LinkButton1.Visible = False
    Else
    LinkButton1.Visible = True
    End If

    Dim adap As OleDbDataAdapter 'versione con dataset
    Dim data_bici As DataSet 'versione con dataset
    Dim prodotti As DataTable 'versione con dataset
    Dim col_uni As DataColumn 'versione con dataset-2
    data_bici = New DataSet()
    prodotti = New DataTable("prd")

    col_uni = New DataColumn("id2", GetType(Int32)) 'versione con dataset-2
    col_uni.AutoIncrement = True 'versione con dataset-2
    col_uni.AutoIncrementSeed = 1
    prodotti.Columns.Add(col_uni) 'versione con dataset-2
    data_bici.Tables.Add(prodotti) 'versione con dataset-2

    adap = New OleDbDataAdapter(quSQL, cnx) 'versione con dataset
    adap.Fill(data_bici, "prd") 'versione con dataset

    '--------------------------------------------------------------------------
    Label1.Text = (prodotti.Rows.Count) / 3
    Dim pgg1 As Int32
    Dim pager As Int32

    pgg1 = Label2.Text - 1

    'If CInt(Label2.Text) = 1 Then
    'pgg1 = 0
    'Else
    ' pgg1 = CInt(Label2.Text)
    'End If

    pager = 1 + 3 * pgg1

    'Label2.Text = pager

    '--------------------------------------------------------------------------

    Dim dw_prod As DataView
    dw_prod = data_bici.Tables("prd").DefaultView
    dw_prod.RowFilter = "id2>=" & pager & "AND id2<" & pager + 3 & ""



    'DataList1.DataSource = data_bici 'versione con dataset
    DataList1.DataSource = dw_prod 'con paginazione dataview

    DataList1.DataBind() 'versione con dataset




    End Sub


    Public Sub azione(ByVal Pippo As Object, ByVal E As EventArgs)
    Panel1.Visible = False
    Label2.Text = 1
    Call bindata()
    End Sub

    Public Sub azione2(ByVal Pippo As Object, ByVal E As EventArgs)
    Dim pag_attu As Int32
    Dim pag_dopo As Int32

    pag_attu = CInt(Label2.Text)
    Label2.Text = pag_attu + 1


    Call bindata()

    End Sub

    Public Sub azione3(ByVal Pippo As Object, ByVal E As EventArgs)
    Dim pag_attu As Int32
    Dim pag_dopo As Int32

    pag_attu = CInt(Label2.Text)
    Label2.Text = pag_attu - 1

    If Label1.Text = 1 Then
    LinkButton2.Visible = False
    End If
    Call bindata()

    End Sub

    ################################################## ######
    per capirci
    mi pare label2 e label3 sono i pag X/Y

    e linkbutton sono i pulsanti di avanti e indietro
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    75

    Ok

    Grazie x il codice ma mi funzionava,era solo a titolo informativo sapere quale risorsa occupava!Grazie!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.