Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Ottenere DataSet da DataTable

    Ciao ragazzi!
    Sono abbastanza nuovo nella programmazione VB.NET e vi pongo un quesito sul quale mi ci sto arrovellando.
    Ho una funzione già fatta e che vorrei adattare alle mie esigenze:
    codice:
    Private Sub baiSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles baiSave.Click
    Dim scnnNW As New SqlConnection(conStr)
    Dim commBuild As New SqlCommandBuilder(daPianificazione)
    
    daPianificazione.UpdateCommand = commBuild.GetUpdateCommand()
    daPianificazione.DeleteCommand = commBuild.GetDeleteCommand()
    daPianificazione.InsertCommand = commBuild.GetInsertCommand()
      Try
        scnnNW.Open()
        daPianificazione.Update(dsPianificazione, "Cantiere")
        scnnNW.Close()
      Catch ex As Exception
        MsgBox(ex.Message)
      End Try
    End Sub
    Semplice semplice che esegue un aggiornamento utilizzando il dataset dsPianificazione.

    Poi ho questa funzione (ne ho riportato solo la parte che interessa ai fini del quesito...)
    codice:
    Dim dtDatiCancellazioni As DataTable
    Dim dtPianificazione As DataTable = Me.grdPianificazione.DataSource
    dtPianificazione.Rows.RemoveAt(iRow)
    Me.grdPianificazione.DataSource = dtPianificazione
    dtDatiCancellazioni = dtPianificazione.GetChanges(DataRowState.Deleted)
    Quello che voglio ottenere è questo:
    fare in modo di richiamare la funzione baiSave_Click che vada a fare l'update non da un dataset in questo caso ma da un datatable (dtDatiCancellazioni).

    Potete aiutarmi?

    Spero di essere stato chiaro.

    Grazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  2. #2
    Quando chiami il metodo Update del dataadapter, invece di passare il dataset passa direttamente la datatable. Anche in fase di riempimento iniziale invece di usare il metodo Fill del dataadapter sul dataset usalo direttamente sulla datatable.
    Saluti a tutti
    Riccardo

  3. #3
    Quindi dici di fare così:

    codice:
    daPianificazione.Update(dtDatiCancellazioni, "Cantiere")
    Se specifico un datatable invece di un dataset nell'update però mi viene detto:
    Impossibile convertire il valore di tipo "System.Data.DataTable" in "System.Data.DataSet".

    Ma l'update io non posso farlo sia con un dataset che con un datatable?

    Grazie
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  4. #4
    Originariamente inviato da Gianluca Frati
    Ma l'update io non posso farlo sia con un dataset che con un datatable?
    si, stai solo sbagliando ad usare il metodo Update. Se quando lo usi passi un dataset essendo ques'ultimo un contenitore di datatable devi per forza dirgli il nome della tabella su cui effettuare le modifiche. Se invece gli passi una datatable, non devi passargli il nome di se stessa. Quindi
    codice:
    daPianificazione.Update(dtDatiCancellazioni)
    Saluti a tutti
    Riccardo

  5. #5
    Hai ragione!
    Mi stavo perdendo in un bicchier d'acqua...

    Quindi ora ho fatto:
    codice:
    daPianificazione.Update(dtDatiCancellazioni)
    Però il debug, alla riga che ho riportato sopra, mi dice questo:

    Il valore non può essere null.
    Nome parametro: dataTable


    Ho verificato che in effetti nel DataTable delle modifiche ci sia qualcosa:
    codice:
    If dtDatiCancellazioni Is DBNull.Value Then
     MsgBox("Il DataTable dtDatiCancellazioni è vuoto")
    End If
    Ma dentro alla condizione non ci entra, quindi nel DataTable c'è qualcosa.

    Dove sto sbagliando?
    Approfitto della tua gentilezza.

    Grazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  6. #6
    Originariamente inviato da Gianluca Frati
    dentro alla condizione non ci entra, quindi nel DataTable c'è qualcosa.
    Oppure non stai verificando correttamente se la datatable esiste oppure no. Per verificare la corretta esistenza dell'istanza di un certo oggetto non devi usare DBNull (che si usa per verificare i dati provenienti dal db) ma semmai if oggetto is Nothing then o if not oggetto is nothing then.
    Per il resto, dichiara una datatable esterna a metodi e funzioni (facendola diventare in questo modo visibile ell'intera classe) e preoccupati di istanziarla e riempirla prima di utilizzarla.
    Saluti a tutti
    Riccardo

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    la tabella passala cosi dataset.tables(nome-tabella(

  8. #8
    Acc...

    In effetti facendo questo controllo
    codice:
    If dtDatiCancellazioni Is Nothing Then
     MsgBox("Non ci sono modifiche")
    End If
    si può notare che in dtDatiCancellati non c'è nulla.
    Devo fare accettare le modifiche apportate con un AcceptChanges prima di andare a modificare il DB?

    Grazie.
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  9. #9
    Credo che il fulcro del problema sia qua:
    codice:
    dtPianificazione.Rows.RemoveAt(iRow - 1)
    dtPianificazione.AcceptChanges()
    
    Me.grdPianificazione.DataSource = dtPianificazione
    dtDatiCancellazioni = dtPianificazione.GetChanges(DataRowState.Deleted)
    Con le prima due righe cancello la riga che mi interessa cancellare, poi faccio l'accept changes.

    L'ultima riga, dove assegno al datatable dtDatiCancellazioni le modifiche che ho effettuato, forse non fa quello che voglio che faccia visto che dtDatiCancellazioni sarebbe uguale a nothing, anche se in realtà la riga, a livello di rendering della griglia, in effetti risulta cancellata. Ma la modifica non viene apportata al DB.

    Come mai?
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  10. #10
    Originariamente inviato da Gianluca Frati
    Come mai?
    Il metodo acceptchange va usato solo in alcuni casi. In particolare si usa quando si modificano dati in memoria e non si ha la necessita' di riportare le modifiche nel db, praticamente il contrario di quello che vuoi fare tu. In altre parole, quando chiami il metodo acceptchange non fai altro che dire: qualsiasi modifica fatta alla datatable da quando i dati sono stati messi dentro da ora in poi' e' accettata e quindi le righe non risulteranno piu ad es. deleted, modified, inserted ecc.. Quindi chiamato questo metodo, se successivamente chiami es. getchanges non ottieni nulla (nothing). Per il resto, per eliminare delle righe dopo aver individuato l'indice della riga puoi chiamare direttamente il metodo delete es. tuadatatable.rows(indice).delete
    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.