Associare oggetti come origini dati nelle applicazioni .NET Framework con Visual Studio

Nota

I set di dati e le classi correlate sono tecnologie .NET Framework legacy dei primi anni '2000 che consentono alle applicazioni di lavorare con i dati in memoria mentre le applicazioni vengono disconnesse dal database. Sono particolarmente utili per le applicazioni che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Anche se i set di dati hanno dimostrato di essere una tecnologia molto efficace, è consigliabile che le nuove applicazioni .NET usino Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e ha un'interfaccia di programmazione più semplice.

Visual Studio offre strumenti in fase di progettazione per l'uso di oggetti personalizzati come origine dati nell'applicazione. Quando si desidera archiviare dati da un database in un oggetto associato ai controlli dell'interfaccia utente, l'approccio consigliato consiste nell'usare Entity Framework per generare la classe o le classi. Entity Framework genera automaticamente tutto il codice boilerplate di rilevamento delle modifiche, il che significa che tutte le modifiche apportate agli oggetti locali vengono salvate automaticamente nel database quando si chiama AcceptChanges nell'oggetto DbSet. Per altre informazioni, vedere La documentazione di Entity Framework.

Suggerimento

Gli approcci all'associazione a oggetti in questo articolo devono essere considerati solo se l'applicazione è già basata su set di dati. È anche possibile usare questi approcci se si ha già familiarità con i set di dati e i dati da elaborare sono tabulari e non troppo complessi o troppo grandi. Per un esempio ancora più semplice, che prevede il caricamento diretto dei dati in oggetti usando un DataReader e l'aggiornamento manuale dell'interfaccia utente senza associazione dati, vedere Creare una semplice applicazione dati usando ADO.NET.

Requisiti degli oggetti

L'unico requisito per l'uso degli oggetti personalizzati con gli strumenti di progettazione dei dati in Visual Studio è che l'oggetto necessita di almeno una proprietà pubblica.

In genere, gli oggetti personalizzati non richiedono interfacce, costruttori o attributi specifici per fungere da origine dati per un'applicazione. Tuttavia, se si desidera trascinare l'oggetto dalla finestra Origini dati in un'area di progettazione per creare un controllo associato a dati e se l'oggetto implementa l'interfaccia ITypedList o IListSource , l'oggetto deve avere un costruttore predefinito. In caso contrario, Visual Studio non può creare un'istanza dell'oggetto origine dati e viene visualizzato un errore quando si trascina l'elemento nell'area di progettazione.

Esempi di utilizzo di oggetti personalizzati come origini dati

Anche se esistono innumerevoli modi per implementare la logica dell'applicazione quando si usano oggetti come origine dati, per i database SQL esistono alcune operazioni standard che possono essere semplificate usando gli oggetti TableAdapter generati da Visual Studio. Questa pagina illustra come implementare questi processi standard usando TableAdapters. Non è concepito come guida per la creazione di oggetti personalizzati. Ad esempio, in genere si eseguiranno le operazioni standard seguenti indipendentemente dall'implementazione specifica degli oggetti o dalla logica dell'applicazione:

  • Caricamento di dati in oggetti (in genere da un database).

  • Creazione di una raccolta tipizzata di oggetti.

  • Aggiunta di oggetti a e rimozione di oggetti da una raccolta.

  • Visualizzazione dei dati dell'oggetto agli utenti in un modulo.

  • Modifica/modifica dei dati in un oggetto .

  • Salvataggio di dati da oggetti al database.

Caricare dati in oggetti

Per questo esempio, si caricano dati in oggetti usando TableAdapters. Per impostazione predefinita, gli oggetti TableAdapter vengono creati con due tipi di metodi che recuperano i dati da un database e popolano le tabelle dati.

  • Il TableAdapter.Fill metodo riempie una tabella dati esistente con i dati restituiti.

  • Il TableAdapter.GetData metodo restituisce una nuova tabella dati popolata con i dati.

Il modo più semplice per caricare gli oggetti personalizzati con dati consiste nel chiamare il TableAdapter.GetData metodo , scorrere la raccolta di righe nella tabella dati restituita e popolare ogni oggetto con i valori in ogni riga. È possibile creare un GetData metodo che restituisce una tabella dati popolata per qualsiasi query aggiunta a un oggetto TableAdapter.

Nota

Visual Studio assegna un nome alle query Fill TableAdapter e GetData per impostazione predefinita, ma è possibile modificare tali nomi in qualsiasi nome di metodo valido.

Nell'esempio seguente viene illustrato come scorrere le righe di una tabella dati e popolare un oggetto con dati:

private void LoadCustomers()
{
    NorthwindDataSet.CustomersDataTable customerData = 
        customersTableAdapter1.GetTop5Customers();
    
    foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
    {
        Customer currentCustomer = new Customer();
        currentCustomer.CustomerID = customerRow.CustomerID;
        currentCustomer.CompanyName = customerRow.CompanyName;

        if (customerRow.IsAddressNull() == false)
        {
            currentCustomer.Address = customerRow.Address;
        }

        if (customerRow.IsCityNull() == false)
        {
            currentCustomer.City = customerRow.City;
        }

        if (customerRow.IsContactNameNull() == false)
        {
            currentCustomer.ContactName = customerRow.ContactName;
        }

        if (customerRow.IsContactTitleNull() == false)
        {
            currentCustomer.ContactTitle = customerRow.ContactTitle;
        }

        if (customerRow.IsCountryNull() == false)
        {
            currentCustomer.Country = customerRow.Country;
        }

        if (customerRow.IsFaxNull() == false)
        {
            currentCustomer.Fax = customerRow.Fax;
        }

        if (customerRow.IsPhoneNull() == false)
        {
            currentCustomer.Phone = customerRow.Phone;
        }

        if (customerRow.IsPostalCodeNull() == false)
        {
            currentCustomer.PostalCode = customerRow.PostalCode;
        }

        if (customerRow.IsRegionNull() == false)
        {
            currentCustomer.Region = customerRow.Region;
        }

        LoadOrders(currentCustomer);
        customerBindingSource.Add(currentCustomer);
    }
}

Creare una raccolta tipizzata di oggetti

È possibile creare classi di raccolta per gli oggetti o utilizzare le raccolte tipate fornite automaticamente dal componente BindingSource.

Quando si crea una classe di raccolta personalizzata per gli oggetti, è consigliabile ereditare da BindingList<T>. Questa classe generica fornisce funzionalità per amministrare la raccolta, nonché la possibilità di generare eventi che inviano notifiche all'infrastruttura di data binding in Windows Form.

La raccolta generata automaticamente nell'oggetto BindingSource utilizza un BindingList<T> oggetto per la raccolta tipizzata. Se l'applicazione non richiede funzionalità aggiuntive, è possibile gestire la raccolta all'interno di BindingSource. Per altre informazioni, vedere la List proprietà della BindingSource classe .

Nota

Se la raccolta richiede funzionalità non fornite dall'implementazione di base di BindingList<T>, è necessario creare una raccolta personalizzata in modo da poter aggiungere alla classe in base alle esigenze.

Il codice seguente illustra come creare la classe per una raccolta fortemente tipizzata di Order oggetti:

/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

Aggiungere oggetti a una raccolta

È possibile aggiungere oggetti a una raccolta chiamando il Add metodo della classe di raccolta personalizzata o dell'oggetto BindingSource.

Nota

Il Add metodo viene fornito automaticamente per la raccolta personalizzata quando si eredita da BindingList<T>.

Nel codice seguente viene illustrato come aggiungere oggetti all'insieme tipizzato in un BindingSourceoggetto :

Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

Il codice seguente illustra come aggiungere oggetti a una raccolta tipizzata che eredita da BindingList<T>:

Nota

In questo esempio, l'insieme Orders è una proprietà dell'oggetto Customer .

Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

Rimuovere oggetti da una raccolta

È possibile rimuovere oggetti da una raccolta chiamando il Remove metodo o RemoveAt della classe di raccolta personalizzata o di BindingSource.

Nota

I Remove metodi e RemoveAt vengono forniti automaticamente per la raccolta personalizzata quando si eredita da BindingList<T>.

Il codice seguente illustra come individuare e rimuovere oggetti dalla raccolta tipizzata in un BindingSource oggetto con il RemoveAt metodo :

int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

Visualizzare i dati degli oggetti agli utenti

Per visualizzare i dati negli oggetti agli utenti, creare un'origine dati oggetto usando la Configurazione guidata origine dati e quindi trascinare l'intero oggetto o le singole proprietà nel form dalla finestra Origini dati.

Modificare i dati negli oggetti

Per modificare i dati in oggetti personalizzati associati a controlli Windows Form, è sufficiente modificare i dati nel controllo associato (o direttamente nelle proprietà dell'oggetto). L'architettura di data binding aggiorna i dati nell'oggetto .

Se l'applicazione richiede il rilevamento delle modifiche e il rollback delle modifiche proposte ai valori originali, è necessario implementare questa funzionalità nel modello a oggetti. Per esempi di come le tabelle dati tengono traccia delle modifiche proposte, vedere DataRowState, HasChangese GetChanges.

Salvare di nuovo i dati negli oggetti nel database

Salvare nuovamente i dati nel database passando i valori dall'oggetto ai metodi DBDirect di TableAdapter.

Visual Studio crea metodi DBDirect che possono essere eseguiti direttamente sul database. Questi metodi non richiedono oggetti DataSet o DataTable.

Metodo DBDirect di TableAdapter Descrizione
TableAdapter.Insert Aggiunge nuovi record a un database, consentendo di passare singoli valori di colonna come parametri del metodo.
TableAdapter.Update Aggiornamenti record esistenti in un database. Il metodo Update accetta valori di colonna originali e nuovi come parametri del metodo. I valori originali vengono usati per individuare il record originale e i nuovi valori vengono usati per aggiornare il record.

Il TableAdapter.Update metodo viene usato anche per riconciliare le modifiche in un set di dati nel database, accettando una DataSetmatrice , DataTable, DataRowo di s come parametri del DataRowmetodo.
TableAdapter.Delete Elimina i record esistenti dal database in base ai valori di colonna originali passati come parametri del metodo.

Per salvare i dati da una raccolta di oggetti, scorrere la raccolta di oggetti , ad esempio usando un ciclo for-next. Inviare i valori per ogni oggetto al database usando i metodi DBDirect di TableAdapter.

Nell'esempio seguente viene illustrato come usare il TableAdapter.Insert metodo DBDirect per aggiungere un nuovo cliente direttamente al database:

private void AddNewCustomers(Customer currentCustomer)
{
    customersTableAdapter.Insert( 
        currentCustomer.CustomerID, 
        currentCustomer.CompanyName, 
        currentCustomer.ContactName, 
        currentCustomer.ContactTitle, 
        currentCustomer.Address, 
        currentCustomer.City, 
        currentCustomer.Region, 
        currentCustomer.PostalCode, 
        currentCustomer.Country, 
        currentCustomer.Phone, 
        currentCustomer.Fax);
}