Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    46

    [VB 2005] ADO.NET 2 - Vincoli di integrità

    Ciao a tutti.

    Ho 2 tabelle, Clienti e Ordini.
    Queste due tabelle sono correlate ed esiste un vincolo di integrità grazie al quale posso cancellare un cliente solo se non esistono ordini correlati.
    Il tutto è stato impostato nel database.

    Ho un datagridview popolato dai records della tabella clienti:
    dgw.datasource=dataset.Tables("Clienti")

    Dal dgw posso aggiungere eliminare o modificare.
    Quando elimino una riga, anche se il cliente ha degli ordini, l'eccezione non viene generata fino a quando non mando le modifiche al db. Io vorrei che nel momento in cui, con il tasto CANC, elimino una riga dal dgw e violo un vincolo di integrità mi venisse generata subito l'eccezione che a quel punto vado a gestire.
    Ho creato l'oggetto datarelation impostando i campi padre e figlio, ma non succede nulla.
    gs

  2. #2
    oltre ad impostare i campi padre e figlio devi impostare il comportamento in caso di update e delete... da codice non so come si fa perchè non l'ho mai utilizzata.. preferisco usare direttamente il db... ho controllato comunque che a livello visuale si fa la relazione tra le tabelle all'interno del dataset e si può impostare il comportamento che serve a te...

    spero di esserti stato d'aiuto... ciao ciao
    I database... la mia passione + o -

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    46
    Grazie per l'aiuto ma ho già risolto. Appena posso pubblico il codice nella discussione.

    gs

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    46
    Ecco il codice:

    Public Class form

    Dim daclienti As New OleDbDataAdapter

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

    Dim cmdclienti As New OleDbCommand("TB_TClienti", conn)
    cmdclienti.CommandType = CommandType.TableDirect

    Dim cmdordini As New OleDbCommand("Select ID_Cliente from TB_Ordini group by ID_Cliente", conn)

    daclienti.SelectCommand = cmdclienti
    daclienti.MissingSchemaAction = MissingSchemaAction.AddWithKey

    Dim daordini As New OleDbDataAdapter(cmdordini)
    daordini.MissingSchemaAction = MissingSchemaAction.AddWithKey

    'Creo un commandbuilder per inviare le modifiche al database
    'attraverso il dataadapter corrispondente
    Dim cmbclienti As New OleDbCommandBuilder(daclienti)


    'Aggiungo le tabelle al dataset
    daclienti.Fill(dscliord, "TB_Clienti")
    daordini.Fill(dscliord, "TB_Ordini")


    'PC è la colonna parent (Padre) e CC è la colonna child (Figlia)
    Dim pc As DataColumn = dscliord.Tables("TB_Clienti").Columns("ID")
    Dim cc As DataColumn = dscliord.Tables("TB_Ordini").Columns("ID_Cliente")

    'Creo la relazione con il vincolo di integrità specificando
    'la colonna padre e la colonna figlia
    Dim fk As ForeignKeyConstraint = New ForeignKeyConstraint("FK", pc, cc)

    'Aggiungo il vincolo alla tabella degli ordini
    dscliord.Tables("TB_Ordini").Constraints.Add(fk)

    'Stabilisco che se elimino un record padre non viene eseguita nessuna azione
    'sui record figli e grazie al vincolo di integrità viene generata un'eccezione
    fk.DeleteRule = Rule.None

    'Popolo il datagridview
    dgw.DataSource = dscliord.Tables("TB_Clienti")


    End Sub

    Private Sub dgw_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArg s) Handles dgw.DataError
    Try
    dgw.Rows.Remove(dgw.CurrentRow)
    Catch ex As Exception
    MsgBox("Impossibile eliminare la riga", MsgBoxStyle.Information)
    End Try
    End Sub

    Private Sub SalvaToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalvaToolStripButton.Click

    daclienti.Update(dscliord, "TB_Clienti")

    End Sub

    End Class


    Ciao......
    gs

  5. #5
    Ciao
    grazie per l'esempio.
    Vorrei chiederti se invece volessi eliminare i record
    della tabella ordini.
    Ho provato a inserire
    fk.DeleteRule = Rule.Cascade
    ma non funziona.

    Sai perche?

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    46
    hai applicato i vincoli di integrità alla join nella struttura del database?
    gs

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.