HOW TO: Aggiornare un database di SQL Server utilizzando l'oggetto SqlDataAdapter in Visual Basic .NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I308055
Per la versione di questo articolo relativa a Microsoft Visual C# .NET vedere (gli articoli con prefisso "Q" contengono informazioni in inglese): 308507.
Sommario
In questo articolo sono contenuti esempi di codice Visual Basic .NET che illustrano come utilizzare l'oggetto SqlDataAdapter per aggiornare un database di SQL Server con le modifiche ai dati che vengono eseguite su un oggetto DataSet popolato con dati provenienti da una tabella del database.

Torna all'inizio

Requisiti

Di seguito vengono elencati l'hardware, il software, l'infrastruttura di rete, le capacità, le conoscenze e i Service Pack necessari:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server.
  • Microsoft Visual Studio .NET.
  • Microsoft SQL Server versione 7.0 o successive.
In questo articolo si presume la conoscenza dei seguenti argomenti:
  • Visual Basic .NET.
  • Nozioni fondamentali e sintassi di ADO.NET.
Torna all'inizio

Descrizione della tecnica

L'oggetto SqlDataAdapter funge da ponte tra un oggetto DataSet di ActiveX Data Objects (ADO) .NET e un database di SQL Server. Si tratta di un oggetto intermediario che popola un dataset di ADO.NET con i dati recuperati da un database di SQL Server e in seguito aggiorna il database per riflettere le modifiche, quali inserimenti, aggiornamenti o eliminazioni, apportate ai dati utilizzando l'oggetto DataSet.

Le proprietà InsertCommand, UpdateCommand e DeleteCommand dell'oggetto SqlDataAdapter aggiornano il database con le modifiche ai dati eseguite su un oggetto DataSet. Queste proprietà sono oggetti SqlCommand che specificano i comandi Transact SQL INSERT, UPDATE e DELETE utilizzati per inserire le modifiche al dataset nel database di destinazione. Gli oggetti SqlCommand assegnati a queste proprietà possono essere creati manualmente nel codice oppure generati automaticamente utilizzando l'oggetto SqlCommandBuilder.

Il primo codice di esempio riportato in questo articolo illustra come utilizzare l'oggetto SqlCommandBuilder per generare automaticamente la proprietà UpdateCommand dell'oggetto SqlDataAdapter. Il secondo codice di esempio ricrea uno scenario in cui non è possibile ricorrere alla generazione automatica dei comandi, per illustrare come creare manualmente e utilizzare l'oggetto SqlCommand come proprietà UpdateCommand di un oggetto SqlDataAdapter.

Torna all'inizio

Creare la tabella di esempio di SQL Server

Per creare una tabella di esempio di SQL Server che possa essere utilizzata nei codici di esempio di Visual Basic .NET riportati in questo articolo, attenersi alla seguente procedura:
  1. Aprire Analizzatore query di SQL Server e connettersi al database in cui si desidera creare la tabella di esempio. I codici di esempio riportati in questo articolo utilizzano il database di esempio Northwind fornito con SQL Server.
  2. Eseguire le istruzioni di Transact SQL riportate di seguito per creare una tabella di esempio denominata CustTest e inserirvi un record:
    Create Table CustTest( CustID int primary key, CustName varchar(20))Insert into CustTest values(1,'John')
Torna all'inizio

Codice di esempio 1 - Comandi generati automaticamente

Se l'istruzione SELECT utilizzata per recuperare i dati che popolano un oggetto DataSet è basata su una singola tabella di database, sarà possibile utilizzare l'oggetto CommandBuilder per generare automaticamente le proprietà DeleteCommand, InsertCommand e UpdateCommand di DataAdapter. Questo semplifica e riduce il codice richiesto per eseguire le operazioni INSERT, UDPATE e DELETE.

Il requisito minimo per garantire che la generazione automatica dei comandi funzioni consiste nell'impostare la proprietà SelectCommand. Lo schema della tabella recuperata da SelectCommand determina la sintassi delle istruzioni INSERT, UPDATE e DELETE generate automaticamente.

SelectCommand deve inoltre restituire almeno una chiave primaria o una colonna univoca. Se non è presente alcuna chiave primaria o colonna univoca, verrà generato un errore di eccezione InvalidOperation e i comandi non verranno generati.

Per creare un'applicazione console di esempio di Visual Basic .NET che illustri l'utilizzo dell'oggetto SqlCommandBuilder per la generazione automatica delle proprietà dell'oggetto SqlCommandDeleteCommand, InsertCommand e UpdateCommand, per un oggetto SqlDataAdapter, attenersi alla procedura seguente:
  1. Creare una nuova applicazione console di Visual Basic .NET.
  2. Sostituire il contenuto predefinito di Module1 con il codice riportato di seguito:
    Imports System.Data.SqlClientImports Console = System.ConsoleModule Module1    Sub Main()        Dim cn As New SqlConnection()        Dim CustomersDataSet As New DataSet()        Dim da As SqlDataAdapter        Dim dr As DataRow        Dim cmdBuilder As SqlCommandBuilder            'Set the connection string of the SqlConnection object to connect to the        'SQL Server database in which you created the sample table.        cn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"        cn.Open()                      'Initialize the SqlDataAdapter object by specifying a Select command         'that retrieves data from the sample table.        da = New SqlDataAdapter("select * from CustTest order by CustId", cn)        'Initialize the SqlCommandBuilder object to automatically generate and initialize        'the UpdateCommand, InsertCommand and DeleteCommand properties of the SqlDataAdapter.        cmdBuilder = New SqlCommandBuilder(da)        'Populate the dataset by running the Fill method of the SqlDataAdapter.        da.Fill(CustomersDataSet, "Customers")               'Display the Update, Insert and Delete commands that were automatically generated        'by the SqlCommandBuilder object.         Console.WriteLine("Update command Generated by the Command Builder : ")        Console.WriteLine("==================================================")        Console.WriteLine(cmdBuilder.GetUpdateCommand.CommandText)        Console.WriteLine("         ")        Console.WriteLine("Insert command Generated by the Command Builder : ")        Console.WriteLine("==================================================")        Console.WriteLine(cmdBuilder.GetInsertCommand.CommandText)        Console.WriteLine("         ")                Console.WriteLine("Delete command Generated by the Command Builder : ")        Console.WriteLine("==================================================")        Console.WriteLine(cmdBuilder.GetDeleteCommand.CommandText)        Console.WriteLine("         ")        'Write out the value in the CustName field before updating the data using the DataSet.        Console.WriteLine("Customer Name before Update : " & CustomersDataSet.Tables("Customers").Rows(0)("CustName"))        'Modify the value of the CustName field.        CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Jack"        'Post the data modification to the database.        da.Update(CustomersDataSet, "Customers")                Console.WriteLine("Customer Name updated successfully")        'Close the database connection.        cn.Close()        Console.ReadLine()    End SubEnd Module
  3. Salvare ed eseguire l'applicazione. Verrà visualizzata una finestra di console contenente il seguente output:
    Update command Generated by the Command Builder : ==================================================UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( CustID = @p3 AND CustName = @p4 )         Insert command Generated by the Command Builder : ==================================================INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )         Delete command Generated by the Command Builder : ==================================================DELETE FROM  CustTest WHERE ( CustID = @p1 AND CustName = @p2 )         Customer Name before Update : JohnCustomer Name updated successfully
  4. Premere qualsiasi tasto per chiudere la finestra di console e arrestare l'applicazione.
Torna all'inizio

Codice di esempio 2 - Creare e inizializzare manualmente la proprietà UpdateCommand

L'output generato dal codice di esempio 1 indica che la logica della generazione automatica dei comandi per le istruzioni UPDATE si basa sulla concorrenza ottimistica. Ciò significa che i record non sono bloccati per la modifica bensì possono essere modificati da altri utenti o processi in qualunque momento. Poiché un record potrebbe essere modificato dopo essere stato restituito dall'istruzione SELECT, ma prima dell'invio dell'istruzione UPDATE, l'istruzione UPDATE generata automaticamente conterrà una proposizione WHERE, in modo che una riga venga aggiornata solo se contiene tutti i valori originali e se non è stata eliminata. Questo viene fatto per evitare che i nuovi dati vengano sovrascritti. Nei casi in cui un'istruzione UPDATE generata automaticamente tenti di aggiornare una riga che è stata eliminata o non contiene più i valori originali trovati in DataSet, il comando non influirà su alcun record e verrà generata una DBConcurrencyException.

Se si desidera che l'istruzione UPDATE venga portata a termine indipendentemente dai valori originali, sarà necessario impostare esplicitamente la proprietà UpdateCommand per DataAdapter e non fare affidamento alla generazione automatica dei comandi.

Per creare e inizializzare manualmente la proprietà UpdateCommand dell'oggetto SqlDataAdapter utilizzato nel codice di esempio 1, attenersi alla procedura seguente:
  1. Sostituire il codice esistente in Sub Main di Module1 dell'applicazione console di Visual Basic .NET creata con il codice di esempio 1 con quanto riportato di seguito:
    Dim cn As New SqlConnection()Dim CustomersDataSet As New DataSet()Dim da As SqlDataAdapterDim dr As DataRow        Dim DAUpdateCmd As SqlCommandcn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"cn.Open()da = New SqlDataAdapter("select * from CustTest order by CustId", cn)'Initialize the SqlCommand object that will be used as the DataAdapter's UpdateCommand.'Note that the WHERE clause uses only the CustId field to locate the record that is to be updated.DAUpdateCmd = New SqlCommand("Update CustTest set CustName = @pCustName where CustId = @pCustId", da.SelectCommand.Connection)'Create and append the parameters for the Update command.DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustName", SqlDbType.VarChar))DAUpdateCmd.Parameters("@pCustName").SourceVersion = DataRowVersion.CurrentDAUpdateCmd.Parameters("@pCustName").SourceColumn = "CustName"DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustId", SqlDbType.Int))DAUpdateCmd.Parameters("@pCustId").SourceVersion = DataRowVersion.OriginalDAUpdateCmd.Parameters("@pCustId").SourceColumn = "CustId"'Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapter.da.UpdateCommand = DAUpdateCmd        da.Fill(CustomersDataSet, "Customers")        Console.WriteLine("Customer Name before Update : " & CustomersDataSet.Tables("Customers").Rows(0)("CustName"))CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Jack"da.Update(CustomersDataSet, "Customers")        Console.WriteLine("Customer Name updated successfully")cn.Close()Console.ReadLine()
  2. Eseguire i passaggi da 1 a 4 della sezione "Codice di esempio 1 - Comandi generati automaticamente". Il messaggio di errore DBConcurrencyException non verrà più generato.
Torna all'inizio
Właściwości

Identyfikator artykułu: 308055 — ostatni przegląd: 04/08/2003 16:33:00 — zmiana: 2.0

Microsoft ADO.NET (incluso in .NET Framework), Microsoft Visual Basic .NET 2002 Standard Edition

  • kbhowto kbhowtomaster kbgrpdsvbdb KB308055
Opinia