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

Traduzione articoli Traduzione articoli
Identificativo articolo: 308055 - Visualizza i prodotti a cui si riferisce l?articolo.
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.
Espandi tutto | Chiudi tutto

In questa pagina

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.

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.

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.

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')

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.SqlClient
    Imports Console = System.Console
    
    Module 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 Sub
    
    End 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 : John
    Customer Name updated successfully
    
  4. Premere qualsiasi tasto per chiudere la finestra di console e arrestare l'applicazione.

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 SqlDataAdapter
    Dim dr As DataRow        
    Dim DAUpdateCmd As SqlCommand
    
    
    cn.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.Current
    DAUpdateCmd.Parameters("@pCustName").SourceColumn = "CustName"
    
    DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustId", SqlDbType.Int))
    DAUpdateCmd.Parameters("@pCustId").SourceVersion = DataRowVersion.Original
    DAUpdateCmd.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.

Proprietā

Identificativo articolo: 308055 - Ultima modifica: martedė 8 aprile 2003 - Revisione: 2.0
Le informazioni in questo articolo si applicano a
  • Microsoft ADO.NET (incluso in .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi: 
kbhowto kbhowtomaster kbgrpdsvbdb KB308055
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com