Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110

    [VB.NET] - Vincoli chiavi esterne che non funzionano

    Ciao a tutti....eccomi qui con l'ennesimo problema coi dataset (che giuro che non userò mai più per i progetti futuri).

    Vi ipotizzo uno scenario:

    TABELLE:
    • Persone
      • id_Per
      • nome_Per

    • Oggetti
      • id_Ogg
      • idPer_Ogg
      • nome_Ogg


    La tabella Persone ha una relazione uno-a-molti con la tabella Oggetti che viene definita con un vincolo tra l'id della persona (id_Per) e il campo iPer_Ogg (nella tabella Oggetti).

    Per leggere i dati uso 2 semplici datagridview che riempio tramite i rispettivi bindingsource collegati ad un'istanza del dataset le cui tabelle riempio eseguendo un FILL() al LOAD del form che le contiene.

    Sin qui tutto semplice...

    La relazione tra le 2 datatable è vincolata con UPDATE/DELETE/INSERT a CASCADE.

    Ora detto ciò io mi aspetto che se Aggiorno o Elimino una datarow dalla datatable PERSONE in automatico (a CASCADE appunto) mi venga gestito l'evento sulla tabella OGGETTI ma così non avviene....

    Quando aggiungo una nuova riga alla tabella Persone funziona tutto fino al nuovo "Fill()" della tabella dove mi da un errore...

    Il codice è questo:
    codice:
     Dim r As DataSet1.personeRow= Me.ds.persone.NewpersoneRow
            r.nome_Per = TextBox1.Text
            Me.ds.persone.AddpersoneRow(r)
            Dim TA As New DataSet1TableAdapters.personeTableAdapter
            TA.Update(Me.ds.persone)
            TA.Fill(Me.ds.persone)
    e l'errore è questo:

    'Impossibile cancellare la tabella persone. I vincoli imposti da ForeignKeyConstraint fk_oggetti_persone comporterebbero ripercussioni sulle righe figlio in oggetti"

    Sostanzialmente siccome ho impostato un CLEAR automatico prima di ogni FILL(), che ovviamente deve essere eseguito per pulire il datatable prima di ricaricare i dati, mi dice che i vincoli non gli permettono di fare il CLEAR perchè influisce sulle righe figlio...ma le righe figlio sono in un altro bindingsource e un'altra datagridview...

    Qualcuno mi sa dare una mano? Perchè io ormai sono allibita dai limiti di questo tipo di gestione dei dati...

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Se il vincolo è impostato su SQL è quest'ultimo che genera l'errore, prova prima a cancellare i figli e poi il padre, dovrebbe funzionare
    Riccardo Sadocchi
    Microsoft MCP C#

  3. #3
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Si cancellando i figli e poi il padre funziona...però se devo occuparmene io manualmente allora a che serve mettere il vincolo?

  4. #4
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Si cancellando i figli e poi il padre funziona...però se devo occuparmene io manualmente allora a che serve mettere il vincolo?
    ottima osservazione. che db usi?

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Si cancellando i figli e poi il padre funziona...però se devo occuparmene io manualmente allora a che serve mettere il vincolo?
    Mettere il vincolo serve a garantire che non vi siano figli senza padre, in primis.
    L'eliminazione automatica in cascata è un plus...

    Per scendere nei dettagli, bisognerebbe approfondire il database utilizzato e/o il framework (es. ORM).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Esatto, alka ha perfettamente ragion.

    La FK non serve per eliminare tutto automaticamente, ma a fare in modo che un elemento figlio sia sempre linkato correttamente ad un elemento padre ESISTENTE, ed è proprio per questo che non ti permette di eliminare il padre senza prima eliminare i figli.
    Riccardo Sadocchi
    Microsoft MCP C#

  7. #7
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Si ok ma io il CASCADE lo ho settato.

    Sto usando un dataset (su MySQL non ho mai avuto questo problema).
    Ho impostato tutte le relazioni delle dataTables su CASCADE ma continua a darmi questo problema...

    Senza il cascade automatico mi si complica davvero la vita....

    Dopo la questione della mancata gestione del NULL se mi dite che non funzionano nemmeno i Cascade vado da chi ha progettato il metodo dei dataset e gli metto una bomba in casa!

  8. #8
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Anche perchè a sto punto mi viene da pensare che il cascade non funzioni nemmeno se edito la colonna...(cosa che mi accingo a verificare subito)

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    In realtà, la natura del problema originale mi è difficile diagnosticarla perché si parla di rimozione di record, ma nel codice di esempio è un nuovo record a essere inserito.

    Inoltre, sembra quasi che ci sia un tentativo di rimuovere una tabella, analizzando il messaggio di errore, piuttosto che un singolo record.

    Si parla di un "clear preventivo", ma forse c'è una sequenza di operazioni che riconduce il DataSet a fare ciò che non dovrebbe.

    In teoria, tutte le operazioni si dovrebbero basare sul DataSet e non dovrebbe esserci la necessità di "pulire" nulla.

    Magari la costruzione di un prototipo per isolare le operazioni e verificare meglio il problema sarebbe utile.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Quote Originariamente inviata da alka Visualizza il messaggio
    In realtà, la natura del problema originale mi è difficile diagnosticarla perché si parla di rimozione di record, ma nel codice di esempio è un nuovo record a essere inserito.
    Si perchè il problema si verifica quando ripeto un fill() su una tabella e il tableAdapter è impostato per effettuare il clearBeforeFill() però non riesce appunto per via dei vincoli.

    Quote Originariamente inviata da alka Visualizza il messaggio
    Inoltre, sembra quasi che ci sia un tentativo di rimuovere una tabella, analizzando il messaggio di errore, piuttosto che un singolo record.
    credo dipenda che nel fill() io inserisco la tabella che va "fillata" appunto.


    Il discorso però è: il cascade funziona o no? Perchè in caso di risposta affermativa mi aspetto che se applico un clear() su una tabella tutto venga gestito a cascata appunto!

    Perchè se io ho una tabella padre con 10 tabelle figlie diventa molto complicato star dietro a tutti i vincoli ogni volta che effetto una modifica o eliminazione di record dalla tabella padre...
    Sono abituata con cascade che mi gestiscono in automatico queste cose...e dacchè nella relazione tra dataTable questo tipo di metodo c'è e me lo fa aspettare non capisco perchè non funzioni...

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