Al momento sei offline in attesa che la connessione Internet venga ristabilita

Aggiornamento di un database da un oggetto DataSet utilizzando Visual C# 2005 or Visual C# .NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I307587
Per la versione di questo articolo relativa a Microsoft Visual Basic .NET, vedere 301248.
Per una versione di questo articolo relativa a Microsoft Visual C++ .NET, vedere 815660.

In questo articolo viene fatto riferimento ai seguenti spazi dei nomi della libreria di classi di Microsoft .NET Framework:
  • System.Data
  • System.Data.SqlClient
Sommario
In questo articolo viene descritto in dettaglio come utilizzare un oggetto DataSet contenente dati caricati da un database, modificare i dati e rinviarli al database per aggiornare l'origine iniziale.

Gli oggetti DataSet, una parte fondamentale dell'accesso ai dati in Microsoft .NET Framework, sono oggetti residenti in memoria in grado di contenere tabelle, viste e relazioni.

Requisiti

Nell'elenco che segue sono indicati l'hardware, il software, l'infrastruttura di rete e i service pack necessari:
  • Microsoft Windows Server 2003, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server o Microsoft Windows NT 4.0 Server
  • Microsoft SQL Server versione 7.0, Microsoft SQL Server 2000 oppure Microsoft Data Engine (MSDE), con installato il database di esempio PUBS
  • Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET
In questo articolo si presume la conoscenza dei seguenti argomenti:
  • Terminologia di database
  • Linguaggio SQL (Structured Query Language)

Aggiornamento di un database da un oggetto DataSet

In questa sezione viene spiegato come utilizzare l'oggetto DataSet per aggiornare i dati contenuti in un database. È importante ricordare che è possibile anche utilizzare un oggetto SqlCommand per inserire, aggiornare ed eliminare direttamente i dati del database.

Per comprendere meglio quanto descritto in questo articolo, fare clic sul numero dell'articolo della Knowledge Base riportato di seguito:
314145 Come popolare un oggetto DataSet da un database utilizzando Visual Basic .NET
Alcuni argomenti pertinenti si trovano anche nell'articolo 314145, tra cui informazioni su come recuperare dati da un database e in un oggetto DataSet, nonché informazioni su come DataSet sia separato e distinto dal database.

Dopo il caricamento di DataSet è possibile modificare i dati. L'oggetto DataSet memorizzerà le modifiche. Questo oggettopuò essere considerato una cache residente in memoria dei dati recuperati da un database edè costituito da un insieme di tabelle, relazioni e vincoli.

Per aggiornare un oggetto DataSet e rinviare gli aggiornamenti al database, attenersi alla seguente procedura:
  1. Avviare Visual Studio 2005 o Visual Studio .NET.
  2. Creare una nuova applicazione console in Visual C#. Per impostazione predefinita verrà creata una classe Static e una routine Main() vuota.
  3. Verificare che il progetto contenga un riferimento agli spazi dei nomi System e System.Data. Utilizzare l'istruzione using sugli spazi dei nomi System, System.Data e System.Data.SqlClient, in modo che in seguito non sia più necessario qualificare le dichiarazioni provenienti da questi spazi dei nomi nel codice. Queste istruzioni devono essere utilizzate prima di qualunque altra dichiarazione.
    using System; using System.Data; using System.Data.SqlClient;
  4. Prima di poter modificare i dati e rinviare le modifiche al database è necessario caricare le informazioni nel DataSet. Per la procedura dettagliata, vedere l'articolo 314145. Per evitare duplicazioni il codice di questo passaggio non è riportato in dettaglio.

    La stringa di connessione del codice riportato di seguito si riferisce a SQL Server installato nel computer locale o nel computer in cui è in esecuzione il codice. In breve, vengono creati una connessione e un adattatore dei dati, utilizzato per inserire dati in DataSet.
    Nota È necessario modificare l'ID utente <username> e la password=<strong password> con i valori corretti prima di eseguire il codice. Assicurarsi che l'ID utente disponga delle autorizzazioni appropriate per effettuare questa operazione nel database.
    string sConnectionString;// Modify the following string to correctly connect to your SQL Server. sConnectionString = "Password=<strong password>;User ID=<username>;"         + "Initial Catalog=pubs;"         + "Data Source=(local)";SqlConnection objConn 	         = new SqlConnection(sConnectionString); objConn.Open();  // Create an instance of a DataAdapter.SqlDataAdapter daAuthors         = new SqlDataAdapter("Select * From Authors", objConn);// Create an instance of a DataSet, and retrieve data from the Authors table.DataSet dsPubs = new DataSet("Pubs");daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");daAuthors.Fill(dsPubs,"Authors");
  5. Ora che i dati sono stati caricati è possibile modificarli. Esistono diversi modi per aggiungere una riga o record. Nell'esempio di codice seguente viene utilizzata una procedura in tre passaggi:
    • Ottenere un nuovo oggetto DataRow da DataTable.
    • Impostare i valori del campo DataRow nel modo appropriato.
    • Passare il nuovo oggetto al metodo Add dell'insieme DataTable.Rows.
    Incollare il seguente codice dopo il passaggio 4:
    //****************// BEGIN ADD CODE // Create a new instance of a DataTable.DataTable tblAuthors;tblAuthors = dsPubs.Tables["Authors"];DataRow drCurrent;// Obtain a new DataRow object from the DataTable.drCurrent = tblAuthors.NewRow();// Set the DataRow field values as necessary.drCurrent["au_id"] = "993-21-3427";drCurrent["au_fname"] = "George";drCurrent["au_lname"] = "Johnson";drCurrent["phone"] = "800 226-0752";drCurrent["address"] = "1956 Arlington Pl.";drCurrent["city"] = "Winnipeg";drCurrent["state"] = "MB";drCurrent["contract"] = 1;// Pass that new object into the Add method of the DataTable.tblAuthors.Rows.Add(drCurrent);Console.WriteLine("Add was successful, Click any key to continue!!");Console.ReadLine();// END ADD CODE  					
  6. Per modificare le righe esistenti ottenere l'oggetto DataRow corretto e fornire nuovi valori per una o più colonne. È necessario individuare la riga corretta, un processo agevolato dal fatto di avere caricato lo schema della tabella oltre ai dati con la chiamata a FillSchema del passaggio 4. Con il supporto dello schema viene identificata la colonna che costituisce la chiave primaria della tabella e il metodo Find dell'insieme Rows diventa disponibile.

    Il metodo Find restituisce l'oggetto DataRow con un valore specifico nella chiave primaria, in questo caso au_id. Dopo avere ottenuto DataRow, è possibile modificare le colonne. Non è necessario mandare a capo le modifiche in BeginEdit e EndEdit, ma ciò semplifica le operazioni che DataSet deve eseguire, inclusa l'esecuzione contemporanea di tutti i controlli di convalidadurante la chiamata a EndEdit. Incollare il seguente codice dopo "ADD code":
     //***************** // BEGIN EDIT CODE   drCurrent = tblAuthors.Rows.Find("213-46-8915"); drCurrent.BeginEdit(); drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3); drCurrent.EndEdit(); Console.WriteLine("Record edited successfully, Click any key to continue!!"); Console.ReadLine();  // END EDIT CODE   					
  7. Per aggiornare il database originale con tutte le modifiche, passare DataSet al metodo Update dell'oggetto DataAdapter.

    Tuttavia, prima di poter chiamare Update, è necessario impostare le proprietà InsertCommand, UpdateCommand e DeleteCommand dell'oggetto DataAdapter. È possibile scrivere manualmente codice SQL e popolare queste tre proprietà con oggetti SqlCommand corrispondenti, oltre che utilizzare Visual Studio .NET per generare automaticamente i tre comandi.

    Per generare i comandi obbligatori quando sono necessari, creare un'istanza dell'oggetto SqlCommandBuilder e utilizzare DataAdapter nel costruttore. Se si desidera utilizzare questo metodo, illustrato nel codice di esempio che segue, è necessario che siano disponibili le informazioni della chiave primaria della tabella. Per accedere alle informazioni della chiave primaria, chiamare FillSchema e impostare la proprietà MissingSchemaAction di DataAdapter su AddWithKey oppure impostare la chiave primaria manualmente nel codice. Incollare il seguente codice dopo "EDIT code":
    //*****************// BEGIN SEND CHANGES TO SQL SERVER   SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors); daAuthors.Update(dsPubs, "Authors"); Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes"); Console.ReadLine();  // END SEND CHANGES TO SQL SERVER
  8. Per eliminare completamente una riga, utilizzare il metodo Delete dell'oggetto DataRow. Si noti che l'insieme Rows contiene due metodi, Remove e RemoveAt, che apparentemente eliminano la riga ma in realtà la rimuovono semplicemente dall'insieme. Solo con il metodo Delete l'eliminazione viene rinviata al database di origine. Incollare il seguente codice dopo "SEND CHANGES TO SQL SERVER":
    //*****************//BEGIN DELETE CODEdrCurrent = tblAuthors.Rows.Find("993-21-3427");drCurrent.Delete();Console.WriteLine("Record deleted successfully, Click any key to continue!!");Console.ReadLine();//END DELETE CODE
  9. Inviare le modifiche a SQL Server per rimuovere il record aggiunto in precedenza. Incollare il seguente codice dopo "DELETE code":
    //*****************// CLEAN UP SQL SERVERdaAuthors.Update(dsPubs, "Authors");Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");Console.ReadLine();
  10. Salvare il progetto.
  11. Scegliere Avvia dal menu Debug per eseguire il progetto. Vengono visualizzate varie finestre di messaggio che indicano come procede l'esecuzione del codice e consentono di ricontrollare lo stato corrente dei dati man mano che l'esecuzione procede.

Elenco completo del codice

using System;using System.Data;using System.Data.SqlClient;namespace PopulateDataSet{    /// <summary>    /// Summary description for Class1.    /// </summary>    class Class1    {        static void Main(string[] args)        {            string sConnectionString;            // Modify the following string to correctly connect to your SQL Server.            sConnectionString = "Password=;User ID=sa;"                + "Initial Catalog=pubs;"                + "Data Source=(local)";            SqlConnection objConn                = new SqlConnection(sConnectionString);            objConn.Open();            // Create an instance of a DataAdapter.            SqlDataAdapter daAuthors                 = new SqlDataAdapter("Select * From Authors", objConn);            // Create an instance of a DataSet, and retrieve             // data from the Authors table.            DataSet dsPubs = new DataSet("Pubs");            daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");            daAuthors.Fill(dsPubs,"Authors");             //****************            // BEGIN ADD CODE             // Create a new instance of a DataTable.            DataTable tblAuthors;            tblAuthors = dsPubs.Tables["Authors"];            DataRow drCurrent;            // Obtain a new DataRow object from the DataTable.            drCurrent = tblAuthors.NewRow();            // Set the DataRow field values as necessary.            drCurrent["au_id"] = "993-21-3427";            drCurrent["au_fname"] = "George";            drCurrent["au_lname"] = "Johnson";            drCurrent["phone"] = "800 226-0752";            drCurrent["address"] = "1956 Arlington Pl.";            drCurrent["city"] = "Winnipeg";            drCurrent["state"] = "MB";            drCurrent["contract"] = 1;            // Pass that new object into the Add method of the DataTable.            tblAuthors.Rows.Add(drCurrent);            Console.WriteLine("Add was successful, Click any key to continue!!");            Console.ReadLine();            // END ADD CODE               //*****************            // BEGIN EDIT CODE             drCurrent = tblAuthors.Rows.Find("213-46-8915");            drCurrent.BeginEdit();            drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3);            drCurrent.EndEdit();            Console.WriteLine("Record edited successfully, Click any key to continue!!");            Console.ReadLine();			            // END EDIT CODE               //*****************            // BEGIN SEND CHANGES TO SQL SERVER             SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors);            daAuthors.Update(dsPubs, "Authors");            Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");            Console.ReadLine();			            // END SEND CHANGES TO SQL SERVER             //*****************            //BEGIN DELETE CODE             drCurrent = tblAuthors.Rows.Find("993-21-3427");            drCurrent.Delete();            Console.WriteLine("SRecord deleted successfully, Click any key to continue!!");             Console.ReadLine();                   //END DELETE CODE              //*****************            // CLEAN UP SQL SERVER            daAuthors.Update(dsPubs, "Authors");            Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");            Console.ReadLine();         				        }    }}				
Riferimenti
Per ulteriori informazioni sull'utilizzo di ADO.NET, degli oggetti DataSet e di SQL, visitare i seguenti siti Web Microsoft (informazioni in lingua inglese):
MSDN Online .NET Developer Center
http://msdn.microsoft.com/net
Proprietà

ID articolo: 307587 - Ultima revisione: 01/23/2007 19:26:25 - Revisione: 6.2

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbhowtomaster kbsqlclient kbsystemdata KB307587
Feedback