Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

di il
5 risposte

Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

Salve a tutti,

c# App Windows Form - database sqlserver express


Nel database ci sono due Tabelle Relazionate Uno-Molti con Aggiornamento e Delete in Cascade

L'applicazione prevede il Backup del database , l'utente può salvare il database in un qualsiasi momento.

Fino a qui tutto funziona a regola d'arte.


Il problema si verifica in fase di Restore del database dal Backup.

 - Il Restore viene eseguito correttamente e il dataSet riflette correttamente le Tabelle e le relazioni. con le chiavi esterne…(verificato con il debug entrando in progettazione del dataset e confermato se viene chiusa e riaperta l'App) 

Dopo il restore del database si deve ripopolare una DataGridView che è già stata popolata in fase di Load Form….  

a tal fine si esegue il metodo TableAdapter.Fill(dataSet.MyTable) e questo restituisce errore in quanto presente un vincolo con un altra tabella dove è previsto  l' On Delete Cascade. 
Pertanto non è possibile in questi casi ricaricare la DataGridView 

Errore:

System.Data.InvalidConstraintException:
'Impossibile cancellare la tabella TblService. I vincoli imposti da ForeignKeyConstraint FK_TblUser_TblService
comporterebbero ripercussioni sulle righe figlio in TblUser.'

Come risolvere questo tipo di problema ?  (ovviamente si presenta solo per le tabelle relazionate, per le altre tabelle il Fill si può fare tutte le volte che si vuole)


(La datagridview viene caricata solo con i dati di una tabella e il tableAdapter e il BindigSource riflettono direttamente la Tabella, non ci sono query o altre tipo di origini dati in questo caso)


Grazie !

;-)

5 Risposte

  • Re: Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

    Continuando nello studio e ricerca sul supporto Microsoft dove troviamo :

    Per impostazione predefinita, le tabelle dati in un set di dati vengono generate con relazioni (DataRelation) che corrispondono alle relazioni nel database. Tuttavia, la relazione nel set di dati non viene generata come vincolo di chiave esterna. l'oggetto DataRelation è configurato come Solo relazione senza UpdateRule o DeleteRule in effetti.

    Per impostazione predefinita, gli aggiornamenti a catena e le eliminazioni a catena vengono disattivati anche se la relazione di database è impostata con aggiornamenti a catena e/o eliminazioni a catena attivate. Ad esempio, la creazione di un nuovo cliente e un nuovo ordine e il tentativo di salvare i dati possono causare un conflitto con i vincoli di chiave esterna definiti nel database. Per altre informazioni, vedere Disattivare i vincoli durante il riempimento di un set di dati.

    Disattivare i vincoli durante il riempimento di un set di dati - Visual Studio (Windows) | Microsoft Learn

    verificherò la sospensione del vincolo nel dataset e la sua riattivazione dopo aver ricaricato i TableAdapter… 

  • Re: Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]


    Ho risolto sospendendo i vincoli come riportato nel post precedente.
    Pertanto dopo aver ripristinato il database dal Backup 

    • sospendo i vincoli della relazione 
    • eseguo le Fill
    • rirpristino i vincoli
    • ripopolo gli adapter e bindingsource
    • ripopolo le datagridview 
                    Cursor.Current = Cursors.WaitCursor;
                    if (ClassUtility.MyRestoreApplication(openFileDialog.FileName))
                    {
                        // load table adapter - remove and restore key constraints
                        dataSetServices.EnforceConstraints = false;
                        tblUserTableAdapter.Fill(dataSetServices.TblUser);
                        tblServiceTableAdapter.Fill(dataSetServices.TblService);
                        dataSetServices.EnforceConstraints = true;
    
                        // load bindingsource
                        tblServiceBindingSource.DataSource = dataSetServices.TblService;
                        fKTblUserTblServiceBindingSource.DataSource = tblServiceBindingSource;
                        tblUserBindingSource.DataSource = dataSetServices.TblUser;
    
                        // load datagridview Services
                        DgvServices.DataSource = tblServiceBindingSource;
    
                        // refesh setup table - no key constraints
                        tblSetupTableAdapter.Fill(dataSetServices.TblSetup);
                        tblSetupBindingSource.DataSource = dataSetServices.TblSetup;
                        DgvSetup.DataSource = tblSetupBindingSource;
    
                        // save restore datatime 
                        ClassSetup.MySaveSetupLastRestoreDateTime(DateTime.Now);
                        // initialize setup value
                        MyInitializeSetupValue();
                        // load datagridview table 'dataSetServices.TblSetup'
                        this.tblSetupTableAdapter.Fill(this.dataSetServices.TblSetup);
                    }
                    Cursor.Current = Cursors.Default;
    

    In questo modo non ricevo errori legati al Vincolo delle Relazioni e quando seleziono un record dalla datagrdview Services, con la chiave selezionata mi popola correttamente anche la datagridview della TblUser.

    Dai i primi test che ho effettuato tutto funziona correttamente come prima del Restore del Backup (i dati cambiano con il restore e le relazioni funzionano)

    Se secondo voi risulta corretto l'approccio, chiuderei in questo modo questa parte di codice.

    ;-)

  • Re: Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

    26/09/2023 - By65Franco ha scritto:

    Dai i primi test che ho effettuato tutto funziona correttamente come prima del Restore del Backup (i dati cambiano con il restore e le relazioni funzionano)

    Se secondo voi risulta corretto l'approccio, chiuderei in questo modo questa parte di codice.

    Credo che sia inevitabile, quando si effettuata il dump e il successivo reload del DB, disattivare il controllo dei vincoli (almeno io l'ho sempre fatto). Penso anche che ci sia un vantaggio in termini di velocità di reload (ovviamente dipende dalla mole di dati).

    Probabilmente, se si riesce a garantire la corretta sequenza di reload (ovvero prima le tabelle master e poi quelle detail - sempre che sia fattibile), allora dovrebbe essere possibile lasciare attivi i vincoli … però se i dati sono stati ‘scaricati’ dal DB e poi vengono ricaricati (tal quali), non vedo perchè non dovrebbero essere già corretti a livello di relazioni (e quindi mi sembra ragionevolmente sicuro disattivarne il controllo durante il reload).

  • Re: Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

    26/09/2023 - max.riservo ha scritto:


    Credo che sia inevitabile, quando si effettuata il dump e il successivo reload del DB, disattivare il controllo dei vincoli (almeno io l'ho sempre fatto). Penso anche che ci sia un vantaggio in termini di velocità di reload (ovviamente dipende dalla mole di dati).

    Probabilmente, se si riesce a garantire la corretta sequenza di reload (ovvero prima le tabelle master e poi quelle detail - sempre che sia fattibile), allora dovrebbe essere possibile lasciare attivi i vincoli … però se i dati sono stati ‘scaricati’ dal DB e poi vengono ricaricati (tal quali), non vedo perchè non dovrebbero essere già corretti a livello di relazioni (e quindi mi sembra ragionevolmente sicuro disattivarne il controllo durante il reload).

    Grazie Max, questo mi conforta … per adesso continuo a testarlo come ho riportato sopra, voglio essere sicuro al 100% di ricostruire il dataset con le relazioni che funzionano come in origine prima del backup e restore.

    E ne approfitto per scandagliare nella documentazione Microsoft per approfondire l'argomento. 


    Per quanto riguarda l'ordine in cui ripopolare gli oggetti del database senza sospendere i vincoli, ho potuto verificare che in certe circostanze funzionerebbe e nel mio caso, in un altra parte del codice durante la normale operatività, non sono riuscito a capire l'unica volta che mi ha dato errore di reload per via dei vincoli della relazione.(forse mi mancava un “accetta change” dopo l'update e prima del reload… dovrò approfondire meglio con il debug tutta la casistica in modo da non dover implementare anche lì con la sospensione dei vincoli.

    Bene bene… le tue conferme mi aiutano molto e vado avanti.
    Grazie !!!

    ;-)

  • Re: Fill TableAdapter e Vincoli On Delete Cascade [RISOLTO]

    Nel frattempo metto risolto nel titolo del Thread …

    ma lo lascio aperto se qualcuno volesse aggiungere info e consigli vari

    Grazie 

    ;-)

Devi accedere o registrarti per scrivere nel forum
5 risposte