Compilare set di dati usando TableAdapters nelle applicazioni .NET Framework

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.

Un componente TableAdapter riempie un set di dati con i dati del database, in base a una o più query o stored procedure specificate. Gli oggetti TableAdapter possono anche eseguire aggiunte, aggiornamenti ed eliminazioni nel database per rendere persistenti le modifiche apportate al set di dati. È anche possibile eseguire comandi globali non correlati a una tabella specifica.

Nota

Gli oggetti TableAdapter vengono generati dalle finestre di progettazione di Visual Studio. Se si creano set di dati a livello di codice, usare DataAdapter, ovvero una classe .NET.

Per informazioni dettagliate sulle operazioni TableAdapter, è possibile passare direttamente a uno di questi argomenti:

Argomento Descrizione
Creare e configurare oggetti TableAdapter Come usare le finestre di progettazione per creare e configurare TableAdapter
Creare query TableAdapter con parametri Come consentire agli utenti di fornire argomenti a routine o query TableAdapter
Accedere direttamente al database mediante un oggetto TableAdapter Come usare i metodi Dbdirect di TableAdapters
Disattivare i vincoli durante il riempimento di un set di dati Come usare i vincoli di chiave esterna durante l'aggiornamento dei dati
Come estendere la funzionalità di un TableAdapter Come aggiungere codice personalizzato a TableAdapters
Leggere dati XML in un set di dati Come usare XML

Panoramica degli oggetti TableAdapter

Gli oggetti TableAdapter sono componenti generati dalla finestra di progettazione che si connettono a un database, eseguono query o stored procedure e compilano DataTable con i dati restituiti. Gli oggetti TableAdapter inviano anche dati aggiornati dall'applicazione al database. È possibile eseguire tutte le query desiderate in un TableAdapter purché restituiscano dati conformi allo schema della tabella a cui è associato TableAdapter. Il diagramma seguente mostra come gli oggetti TableAdapter interagiscono con i database e altri oggetti in memoria:

Data flow in a client application

Mentre gli oggetti TableAdapter sono progettati con Progettazione set di dati, le classi TableAdapter non vengono generate come classi nidificate di DataSet. Si trovano in spazi dei nomi separati specifici di ogni set di dati. Ad esempio, se si dispone di un set di dati denominato NorthwindDataSet, gli oggetti TableAdapter associati a DataTables si trovano nello NorthwindDataSet spazio dei NorthwindDataSetTableAdapters nomi . Per accedere a un particolare TableAdapter a livello di codice, è necessario dichiarare una nuova istanza di TableAdapter. Ad esempio:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

Schema DataTable associato

Quando si crea un oggetto TableAdapter, si usa la query iniziale o la stored procedure per definire lo schema dell'oggetto TableAdapter associato.DataTable Eseguire questa query iniziale o stored procedure chiamando il metodo TableAdapter Fill (che riempie l'oggetto TableAdapter associato).DataTable Tutte le modifiche apportate alla query principale di TableAdapter vengono riflesse nello schema della tabella dati associata. Ad esempio, la rimozione di una colonna dalla query principale rimuove anche la colonna dalla tabella dati associata. Se eventuali query aggiuntive in TableAdapter usano istruzioni SQL che restituiscono colonne non incluse nella query principale, la finestra di progettazione tenta di sincronizzare le modifiche delle colonne tra la query principale e le query aggiuntive.

Comandi di aggiornamento tableAdapter

La funzionalità di aggiornamento di un TableAdapter dipende dalla quantità di informazioni disponibili nella query principale nella Creazione guidata TableAdapter. Ad esempio, i tableAdapter configurati per recuperare i valori da più tabelle (usando un JOIN), i valori scalari, le viste o i risultati delle funzioni di aggregazione non vengono inizialmente creati con la possibilità di inviare gli aggiornamenti al database sottostante. Tuttavia, è possibile configurare manualmente i INSERTcomandi , UPDATEe DELETE nella finestra Proprietà .

TableAdapter (query)

TableAdapter with multiple queries

Gli oggetti TableAdapter possono contenere più query per riempire le tabelle di dati associate. È possibile definire il numero di query per un oggetto TableAdapter richiesto dall'applicazione, purché ogni query restituisca dati conformi allo stesso schema della tabella dati associata. Questa funzionalità consente a un TableAdapter di caricare risultati diversi in base a criteri diversi.

Ad esempio, se l'applicazione contiene una tabella con i nomi dei clienti, è possibile creare una query che riempia la tabella con ogni nome cliente che inizia con una determinata lettera e un'altra che riempie la tabella con tutti i clienti che si trovano nello stesso stato. Per riempire una Customers tabella con i clienti in uno stato specifico, è possibile creare una FillByState query che accetta un parametro per il valore di stato come indicato di seguito: SELECT * FROM Customers WHERE State = @State. Per eseguire la query, chiamare il FillByState metodo e passare il valore del parametro nel modo seguente: CustomerTableAdapter.FillByState("WA").

Oltre ad aggiungere query che restituiscono dati dello stesso schema della tabella di dati di TableAdapter, è possibile aggiungere query che restituiscono valori scalari (singoli). Ad esempio, una query che restituisce un conteggio di clienti (SELECT Count(*) From Customers) è valida per un CustomersTableAdapter, oggetto anche se i dati restituiti non sono conformi allo schema della tabella.

ClearBeforeFill - proprietà

Per impostazione predefinita, ogni volta che si esegue una query per riempire una tabella dati di TableAdapter, i dati esistenti vengono cancellati e solo i risultati della query vengono caricati nella tabella. Impostare la proprietà TableAdapter ClearBeforeFill su false se si desidera aggiungere o unire i dati restituiti da una query ai dati esistenti in una tabella dati. Indipendentemente dal fatto che i dati vengano cancellati, è necessario inviare gli aggiornamenti in modo esplicito al database, se si desidera renderli persistenti. Ricordarsi quindi di salvare le modifiche apportate ai dati nella tabella prima di eseguire un'altra query che riempie la tabella. Per altre informazioni, vedere Aggiornare i dati usando un oggetto TableAdapter.

Ereditarietà di TableAdapter

Gli oggetti TableAdapter estendono la funzionalità degli adattatori dati standard incapsulando una classe configurata DataAdapter . Per impostazione predefinita, TableAdapter eredita dalla Component classe e non può essere eseguito il cast alla DataAdapter classe . Il cast di un tableAdapter alla DataAdapter classe genera un InvalidCastException errore. Per modificare la classe di base di un TableAdapter, è possibile specificare una classe derivata da Component nella proprietà Classe base di TableAdapter in Progettazione set di dati.

Metodi e proprietà TableAdapter

La classe TableAdapter non è un tipo .NET. Ciò significa che non è possibile cercarlo nella documentazione o nel Visualizzatore oggetti. Viene creato in fase di progettazione quando si usa una delle procedure guidate indicate in precedenza. Nome assegnato a un TableAdapter quando viene creato in base al nome della tabella in uso. Ad esempio, quando si crea un oggetto TableAdapter basato su una tabella in un database denominato Orders, tableAdapter è denominato OrdersTableAdapter. Il nome della classe di TableAdapter può essere modificato usando la proprietà Name in Progettazione set di dati.

Di seguito sono riportati i metodi e le proprietà comunemente usati di TableAdapters:

Membro Descrizione
TableAdapter.Fill Popola la tabella dati associata di TableAdapter con i risultati del comando di SELECT TableAdapter.
TableAdapter.Update Invia le modifiche al database e restituisce un numero intero che rappresenta il numero di righe interessate dall'aggiornamento. Per altre informazioni, vedere Aggiornare i dati usando un oggetto TableAdapter.
TableAdapter.GetData Restituisce un nuovo DataTable oggetto compilato con dati.
TableAdapter.Insert Crea una nuova riga nella tabella dati. Per altre informazioni, vedere Inserire nuovi record in un database.
TableAdapter.ClearBeforeFill Determina se una tabella dati viene svuotata prima di chiamare uno dei Fill metodi .

TableAdapter update, metodo

Gli oggetti TableAdapter usano comandi di dati per leggere e scrivere dal database. Usare la query iniziale Fill (main) di TableAdapter come base per creare lo schema della tabella dati associata, nonché i InsertCommandcomandi , UpdateCommande DeleteCommand associati al TableAdapter.Update metodo . La chiamata di un metodo TableAdapter esegue le istruzioni create durante la configurazione originale di Update TableAdapter, non una delle query aggiuntive aggiunte con la Configurazione guidata query TableAdapter.

Quando si usa un tableadapter, esegue in modo efficace le stesse operazioni con i comandi che in genere si eseguono. Ad esempio, quando si chiama il metodo dell'adattatore Fill , l'adattatore esegue il comando dati nella relativa SelectCommand proprietà e usa un lettore dati ,ad esempio , SqlDataReaderper caricare il set di risultati nella tabella dati. Analogamente, quando si chiama il metodo dell'adapter Update , esegue il comando appropriato (nelle UpdateCommandproprietà , InsertCommande DeleteCommand ) per ogni record modificato nella tabella dati.

Nota

Se nella query principale sono presenti informazioni sufficienti, i InsertCommandcomandi , UpdateCommande DeleteCommand vengono creati per impostazione predefinita quando viene generato TableAdapter. Se la query principale di TableAdapter è più di una singola istruzione di tabella SELECT , è possibile che la finestra di progettazione non sia in grado di generare InsertCommand, UpdateCommande DeleteCommand. Se questi comandi non vengono generati, è possibile che venga visualizzato un errore durante l'esecuzione del TableAdapter.Update metodo .

TableAdapter GenerateDbDirectMethods

Oltre a InsertCommand, UpdateCommande DeleteCommand, i tableAdapter vengono creati con metodi che è possibile eseguire direttamente nel database. È possibile chiamare questi metodi (TableAdapter.Insert, TableAdapter.Updatee TableAdapter.Delete) direttamente per modificare i dati nel database. Ciò significa che è possibile chiamare questi singoli metodi dal codice anziché chiamare TableAdapter.Update per gestire gli inserimenti, gli aggiornamenti e le eliminazioni in sospeso per la tabella dati associata.

Se non si desidera creare questi metodi diretti, impostare la proprietà GenerateDbDirectMethods di TableAdapter su false (nella finestra Proprietà). Le query aggiuntive aggiunte a TableAdapter sono query autonome, che non generano questi metodi.

Supporto di TableAdapter per tipi nullable

Gli oggetti TableAdapter supportano tipi Nullable(Of T) nullable e T?. Per altre informazioni sui tipi nullable in Visual Basic, vedere Tipi di valori Nullable. Per altre informazioni sui tipi nullable in C#, vedere Usare tipi nullable.

Informazioni di riferimento su TableAdapterManager

Per impostazione predefinita, una classe TableAdapterManager genera quando si crea un set di dati contenente tabelle correlate. Per impedire la generazione della classe, modificare il valore della Hierarchical Update proprietà del set di dati su false. Quando si trascina una tabella con una relazione nell'area di progettazione di una pagina Windows Form o WPF, Visual Studio dichiara una variabile membro della classe . Se non si usa databinding, è necessario dichiarare manualmente la variabile.

La classe TableAdapterManager non è un tipo .NET. Pertanto, non è possibile cercarlo nella documentazione. Viene creato in fase di progettazione come parte del processo di creazione del set di dati.

Di seguito sono riportati i metodi e le proprietà usati di frequente della TableAdapterManager classe :

Membro Descrizione
Metodo UpdateAll Salva tutti i dati da tutte le tabelle dati.
Proprietà BackUpDataSetBeforeUpdate Determina se creare una copia di backup del set di dati prima di eseguire il TableAdapterManager.UpdateAll metodo . Boolean.
tableNameTableAdapter - proprietà Rappresenta un TableAdapter. TableAdapterManager generato contiene una proprietà per ogni TableAdapter classe gestita. Ad esempio, un set di dati con una tabella Customers e Orders genera un oggetto TableAdapterManager che contiene CustomersTableAdapter proprietà e OrdersTableAdapter .
Proprietà UpdateOrder Controlla l'ordine dei singoli comandi di inserimento, aggiornamento ed eliminazione. Impostare questa proprietà su uno dei valori nell'enumerazione TableAdapterManager.UpdateOrderOption .

Per impostazione predefinita, UpdateOrder è impostato su InsertUpdateDelete. Ciò significa che gli inserimenti, gli aggiornamenti e le eliminazioni vengono eseguiti per tutte le tabelle nel set di dati.

Sicurezza

Quando si usano comandi dati con una proprietà CommandType impostata su Text, controllare attentamente le informazioni inviate da un client prima di passarla al database. Qualche utente malintenzionato potrebbe tentare di inviare (inserire) istruzioni SQL modificate o aggiuntive, allo scopo di ottenere un accesso non autorizzato o di danneggiare il database. Prima di trasferire l'input dell'utente in un database, verificare sempre che le informazioni siano valide. Una procedura consigliata consiste nell'usare sempre query o stored procedure con parametri, quando possibile.