Datagridview e Mysql con funzione Group By

di il
7 risposte

Datagridview e Mysql con funzione Group By

Salve a tutti,
ho un piccolo problema con una parte di codice che sembra semplice ma non capisco dove sbaglio.
Ho una datagridview che prende i valori da una tabella Mysql in questo modo:

Dim soggetti As New MySqlDataAdapter
Dim soggettidt As New DataTable
Private WithEvents ss As New BindingSource
Dim ct As New MySqlCommandBuilder(soggetti)

connetti.Open()
comando.CommandText = "SELECT * FROM soggetti GROUP By nome, cognome  ORDER BY cognome ASC ;"  
soggetti.SelectCommand = comando
soggetti.Fill(soggettidt)   ' riempio il datatable
ss.DataSource = soggettidt
DataGridView2.DataSource = ss  ' inseriamo i valori
DataGridView2.Columns("cognome").ReadOnly = True   'non modificabile
DataGridView2.Columns("nome").ReadOnly = True        'non modificabile
DataGridView2.Columns("id").Visible = False 'nasconde id
connetti.Close()   ' connection close...
DataGridView2.Columns("cognome").HeaderText = "Cognome"
DataGridView2.Columns("nome").HeaderText = "Nome"
DataGridView2.Columns("note").HeaderText = "Note: "
come ben vedete ho 3 campi nella mia tabella (nome, cognome e note) ma il datagridview ha solo il campo "note" modificabile.. io vorrei che modificando la cella note, si aggiorni in automatico il DB.. ho inserito il comando:

soggetti.Update(soggettidt)
ma non funziona, credo perche ho selezionato i valori e messi della datagridview con GROUP BY perche non voglio nomi e cognomi duplicati.. ma vorrei che se dovessi modificare il campo "note" a Giuseppe Bianchi ad esempio.. che tale valore venga inserito in tutti i campi "Note" di ogni record della tabella mysql con nome Giuseppe Bianchi... ma continuo ad avere errori e non mi aggiorna il database.. come posso risolvere?

7 Risposte

  • Re: Datagridview e Mysql con funzione Group By

    Se vuoi avere maggiori possibilità che qualcuno ti risponda ti consiglierei di postare tutto il codice ,ciao
  • Re: Datagridview e Mysql con funzione Group By

    Salve,
    come premessa direi che, avendo un raggruppamento,
    GROUP By nome, cognome 
    Ado.Net automaticamente imposta le colonne come readonly in quanto, per "definizione", il dataset non e' aggiornabile...
    e circa la seconda parte della domanda, il problema perviene da quanto sopra...
    innanzitutto non so se la chiave primaria sia coinvolta nella proiezione, ed in ogni caso, andassi tu a modificare la proprieta' {Cognome}, questa modifica andrebbe propagata per tutto il set presente in tabella, qualche cosa che trivialmente assomigli a
    
    UPDATE ...
        SET [Cognome] = @newValue
        WHERE [Cognome] = @oldValue
    ma ripeto, non so se sia in qualche modo coinvolta nella proiezione la chiave primaria, ma dalla proiezione presentata direi di no...
    e anche il fatto che tu voglia propagare la modifica di una colonna a tutte le righe "allacciate" a quell'anagrafica mi suggerisce che il db non e' affatto normalizzato e che, in definitiva, stiamo mettendo una pezza molto brutta a una situazione molto brutta anche essa...

    la cosa, tendenzialmente, direi che e' "fattibile", ma dovresti fare tutto "direttamente a mano", quindi, per ogni riga modificata, preparare un command con l'UPDATE diretto in base all'old_Value ed al new_Value degli attributi di cio' che puo' riuscire ad identificare almeno a livello di "GROUP BY" le righe coinvolte ed ovviamente modificare tutti gli attributi a te interessanti...
    IMVHO, non e' un bel design...

    un saluto
    --
    Andrea
  • Re: Datagridview e Mysql con funzione Group By

    Ciao a tutti e intanto grazie per la risposta.. si in effetti mi sembra un po bruttino il metodo.. ma non so come potrei fare altrimenti.. vi spiego meglio il mio problema.. ho due tabelle in mysql , tabella soggetti (id, cognome, nome, note.. id è chiave) e tabelle telefono (id, numero, note) id e numero sono chiavi... sul mio form invece ho le 2 datagridview... quella collegata al telefono ho questo codice:
    
    Dim numeri As New MySqlDataAdapter
    Dim numeridt As New DataTable
    Private WithEvents tt As New BindingSource
    
    Private Sub primo()
    	connetti.Open()
    	comando.CommandText = "SELECT * FROM telefono ORDER BY numero ASC ;"  
    	numeri.SelectCommand = comando
    	numeri.Fill(numeridt)   
    	Dim ct As New MySqlCommandBuilder(numeri)
    	tt.DataSource = numeridt
    	DataGridView1.DataSource = tt  
    	DataGridView1.Columns("numero").ReadOnly = True
    	DataGridView1.Columns("id").Visible = False    'nasconde id
    	connetti.Close()   ' connection close...
    End Sub
    
    Private Sub tt_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles tt.CurrentItemChanged
                numeri.Update(numeridt)
    End Sub
    
    Se avvio il software, ho tutti i valori nella datagridview1 presi dalla tabella telefono... appena clicco sul datagridview nel campo note (la colonna numero è readonly), scrivo quello che voglio e appena confermo valori con invio, in automatico quello che ho scritto è nella tabella mysql... funziona tutto alla perfezione!!
    Adesso il problema è per la seconda tabella ho un select diverso come detto prima:
    
    comando.CommandText = "SELECT * FROM soggetti  GROUP By nome, cognome  ORDER BY cognome ASC ;"                  
    
    volevo usare lo stesso codice, ma non va.... Ho visto che usando lo stesso codice mi si riempie la datagridview2, modifico nel datagridview il campo note, ma nella tabella mysql non succede nulla.. giustamente perchè è raggruppato per nomi e cognomi... quindi tengo consiglio dell'UPDATE ed ho risolto cosi per chi dovesse servire:
    
    Private WithEvents ss As New BindingSource
    Dim soggetti As New MySqlDataAdapter
    Dim soggettidt As New DataTable
             
    Private Sub secondo()
    connetti.Open()
    comando.CommandText = "SELECT * FROM soggetti GROUP By nome, cognome  ORDER BY cognome ASC ;"  
    soggetti.SelectCommand = comando
    soggetti.Fill(soggettidt)   
    ss.DataSource = soggettidt
    DataGridView2.DataSource = ss  ' inseriamo i valori
    DataGridView2.Columns("cognome").ReadOnly = True   'non modificabile
    DataGridView2.Columns("nome").ReadOnly = True        'non modificabile
    DataGridView2.Columns("id").Visible = False 'nasconde id
    connetti.Close()   ' connection close...
    end sub      
      
    ' /// -> qui cambia  <- ///  
    Private Sub ss_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ss.CurrentItemChanged
     Dim row As DataGridViewRow
    	For Each row In DataGridView2.Rows
    		stringa = "UPDATE soggetti SET note = '" & row.Cells("note").Value.ToString() & "' WHERE  cognome = '" & row.Cells("cognome").Value.ToString() & "' 	AND nome = '" & row.Cells("nome").Value.ToString() & "';"
    		connetti.Open()
    		comando = New MySqlCommand(stringa, connetti)
    		comando.ExecuteNonQuery()
    		connetti.Close()
    	Next  
    End Sub
    
    rispetto a prima non ha una sola riga di comando, ma funziona bene
    Grazie a tutti
  • Re: Datagridview e Mysql con funzione Group By

    Volevo chiederti se non ti conviene mettere la connetti.Open() prima del for e la close dopo il Next così eviti di aprire la connessione n volte , nell'update prendi i valori dai campi ma dove "sanitizzi" i valori per proteggerti dalla sql injection ? https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-parameters.html ,ciao
  • Re: Datagridview e Mysql con funzione Group By

    Si infatti.. mi sa che metterò il connetti.open() prima del for.... ma in che senso "sanitizzi"?
  • Re: Datagridview e Mysql con funzione Group By

    aragorn76 ha scritto:


    ma in che senso "sanitizzi"?
    SQL Injection
  • Re: Datagridview e Mysql con funzione Group By

    Ahh okk.. si.. ho il controllo a monte nella compilazione del dgv.. per il resto il codice fa parte di una delle tanti classi di un plugin che sto creando per un programma... usato da clienti, niente in web o da sguardi indiscreti Grazie comunque per la dritta.
Devi accedere o registrarti per scrivere nel forum
7 risposte