Jak zaktualizować bazę danych przy użyciu obiektu DataSet i programu Visual C# 2005 lub Visual C# .NET

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 307587 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

W tym artykule krok po kroku przedstawiono sposób otrzymania obiektu DataSet zawierającego dane (ładowane z bazy danych), modyfikowania tych danych, a następnie odesłania ich z powrotem do bazy danych w celu aktualizacji oryginalnego źródła.

Obiekty DataSet, będące kluczową częścią mechanizmu dostępu do danych w programie Microsoft .NET Framework, to obiekty w pamięci, w których mogą być przechowywane tabele, widoki i relacje.

Wymagania

Na następującej liście uwzględniono podstawowe składniki zalecanego i niezbędnego sprzętu, oprogramowania, infrastruktury sieciowej i dodatków Service Pack:
  • Systemy Microsoft Windows Server 2003, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server lub Microsoft Windows NT 4.0 Server
  • Oprogramowanie Microsoft SQL Server version 7.0, Microsoft SQL Server 2000 lub Microsoft Data Engine (MSDE) z zainstalowaną przykładową bazą danych
  • Program Microsoft Visual Studio 2005 lub Microsoft Visual Studio .NET
W tym artykule założono, że użytkownik zapoznał się z następującymi zagadnieniami:
  • Terminologia dotycząca baz danych
  • Język SQL (Structured Query Language)

Jak zaktualizować bazę danych przy użyciu obiektu DataSet

W tej sekcji przedstawiono sposób użycia obiektu DataSet do aktualizacji danych w bazie danych. Należy pamiętać, że w celu bezpośredniego wstawiania, aktualizacji i usuwania danych z bazy danych można także użyć obiektu SqlCommand.

Aby móc lepiej zrozumieć niniejszy artykuł, kliknij numer artykułu poniżej w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
314145 JAK: Wypełnianie obiektu DataSet danymi z bazy danych za pomocą programu Visual C# .NET
Niektóre z zagadnień poruszonych w artykule 314145 dotyczą sposobu pobierania danych z bazy danych do obiektu DataSet oraz różnic między obiektem DataSet a bazą danych.

Po załadowaniu obiektu DataSet dane można modyfikować. Zmiany będą śledzone przez obiekt DataSet. Obiekt DataSet można traktować jako działający w pamięci bufor danych pobranych z bazy danych. Obiekt DataSet składa się z kolekcji tabel, relacji i ograniczeń.

Aby zaktualizować obiekt DataSet i przesłać te aktualizacje z powrotem do bazy danych, wykonaj następujące kroki:
  1. Uruchom program Visual Studio 2005 lub Visual Studio .NET.
  2. W programie Visual C# utwórz nową Aplikację konsoli (Console Application). W programie Visual Studio zostanie domyślnie utworzona klasa statyczna Static Class oraz pusta procedura Main().
  3. Upewnij się, że projekt zawiera odwołanie do obszarów nazw System oraz System.Data. Użyj instrukcji using względem obszarów nazw System, System.Data i System.Data.SqlClient, aby później nie trzeba było kwalifikować deklaracji pochodzących z tych obszarów nazw w obrębie kodu programu. Następujących instrukcji należy użyć przed innymi deklaracjami.
    using System;
    using System.Data;
    using System.Data.SqlClient;
    					
  4. Zanim będzie można modyfikować dane i przesyłać zmiany z powrotem do bazy danych, należy załadować te informacje do obiektu DataSet. Szczegółową procedurę można znaleźć w artykule 314145. Aby uniknąć powtarzania, w tym kroku kod nie został przedstawiony szczegółowo.

    Ciąg połączenia w poniższym kodzie wskazuje na serwer SQL znajdujący się na komputerze lokalnym (lub na komputerze, na którym uruchamiany jest program). Podsumowując, zostaje nawiązane połączenie, a następnie tworzony jest adapter danych wykorzystywany do wypełnienia obiektu DataSet danymi.
    Uwaga: Przed uruchomieniem tego programu należy zmienić identyfikator użytkownika <nazwa użytkownika> i hasło <silne hasło> na prawidłowe wartości. Należy sprawdzić, czy z wprowadzonym identyfikatorem użytkownika są związane uprawnienia umożliwiające przeprowadzenie tej operacji w bazie danych.
    string sConnectionString;
    
    // Zmodyfikuj następujący ciąg w celu prawidłowego połączenia się z programem SQL Server.
    sConnectionString = "Password=<silne hasło>;User ID=<nazwa użytkownika>;"
    	+ "Initial Catalog=pubs;"
    	+ "Data Source=(local)";
    
    SqlConnection objConn
    	= new SqlConnection(sConnectionString);
    objConn.Open();
    
    // Utworzenie wystąpienia obiektu DataAdapter.
    SqlDataAdapter daAuthors 
    	= new SqlDataAdapter("Select * From Authors", objConn);
    
    // Utworzenie wystąpienia obiektu DataSet i pobranie danych z tabeli Authors.
    DataSet dsPubs = new DataSet("Pubs");
    daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
    daAuthors.Fill(dsPubs,"Authors");
    					
  5. Ponieważ dane są teraz załadowane, można je modyfikować. Istnieje wiele sposobów dodania wiersza (czyli rekordu). W niniejszym przykładowym kodzie użyto procedury złożonej z trzech kroków:
    • Uzyskanie nowego obiektu DataRow z obiektu DataTable.
    • Ustawienie potrzebnych wartości pól obiektu DataRow.
    • Przekazanie tego nowego obiektu do metody Add kolekcji DataTable.Rows.
    Wklej poniższy kod po kodzie wpisanym w kroku 4:
    //****************
    // ROZPOCZĘCIE KODU DODAWANIA 
    // Utworzenie nowego wystąpienia obiektu DataTable.
    DataTable tblAuthors;
    tblAuthors = dsPubs.Tables["Authors"];
    
    DataRow drCurrent;
    // Uzyskanie nowego obiektu DataRow z obiektu DataTable.
    drCurrent = tblAuthors.NewRow();
    
    // Ustawienie potrzebnych wartości pól obiektu DataRow.
    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;
    
    // Przekazanie tego nowego obiektu do metody Add obiektu DataTable.
    tblAuthors.Rows.Add(drCurrent);
    Console.WriteLine("Dane zostały dodane pomyślnie. Kliknij dowolny klawisz, aby kontynuować!");
    Console.ReadLine();
    
    // ZAKOŃCZENIE KODU DODAWANIA  
    					
  6. Aby edytować istniejące wiersze, należy uzyskać odpowiedni obiekt DataRow, a następnie w jednej lub wielu kolumnach wprowadzić nowe wartości. Najpierw trzeba znaleźć właściwy wiersz, co jest znacznie ułatwione, ponieważ załadowany został zarówno schemat tabeli, jak i dane (wywołanie metody FillSchema w kroku 4). Dzięki schematowi wiadomo, która kolumna w tabeli stanowi klucz podstawowy. Dostępna jest również metoda Find kolekcji Rows.

    Metoda Find zwraca obiekt DataRow o określonej wartości w kluczu podstawowym (w tym przypadku au_id). Po uzyskaniu obiektu DataRow można modyfikować jego kolumny. Nie trzeba ujmować modyfikacji w instrukcje BeginEdit i EndEdit, ale upraszcza to działania, jakie ma do wykonania obiekt DataSet, i pozwala obiektowi DataSet na wykonywanie sprawdzania poprawności równocześnie z wywołaniem instrukcji EndEdit. Wklej następujący kod po kodzie DODAWANIA:
    //*****************
    // ROZPOCZĘCIE KODU EDYCJI 
    
    drCurrent = tblAuthors.Rows.Find("213-46-8915");
    drCurrent.BeginEdit();
    drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3);
    drCurrent.EndEdit();
    Console.WriteLine("Edycja rekordu zakończona powodzeniem. Kliknij dowolny klawisz, aby kontynuować!");
    Console.ReadLine();
    
    // ZAKOŃCZENIE KODU EDYCJI  
    					
  7. Aby zaktualizować oryginalną bazę danych zgodnie z wprowadzonymi zmianami, przekaż obiekt DataSet do metody Update obiektu DataAdapter.

    Jednak przed wywołaniem metody Update trzeba ustawić właściwości InsertCommand, UpdateCommand i DeleteCommand obiektu DataAdapter. Można ręcznie napisać odpowiedni kod SQL i wypełnić te trzy właściwości odpowiednimi obiektami SqlCommand, ale można też użyć programu Visual Studio .NET w celu automatycznego wygenerowania tych trzech poleceń.

    Aby generować wymagane polecenia, gdy są potrzebne, należy utworzyć wystąpienie obiektu SqlCommandBuilder i użyć obiektu DataAdapter w konstruktorze. Jeśli ta metoda ma zostać użyta, co pokazano w przykładowym kodzie poniżej, należy dysponować informacjami dotyczącymi podstawowego klucza danej tabeli. Aby uzyskać dostęp do informacji dotyczących klucza podstawowego, należy wywołać metodę FillSchema, a następnie ustawić właściwość MissingSchemaAction obiektu DataAdapter na wartość AddWithKey lub ręcznie ustawić klucz podstawowy w kodzie programu. Wklej następujący kod po kodzie EDYCJI:
    //*****************
    // ROZPOCZĘCIE PRZESYŁANIA ZMIAN DO SERWERA SQL 
    
    SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors);
    daAuthors.Update(dsPubs, "Authors");
    Console.WriteLine("Serwer SQL został zaktualizowany pomyślnie. Sprawdź zmiany przy użyciu eksploratora serwera.");
    Console.ReadLine();
    
    // ZAKOŃCZENIE PRZESYŁANIA ZMIAN DO SERWERA SQL
    					
  8. Aby całkowicie usunąć jakiś wiersz, należy skorzystać z metody Delete obiektu DataRow. Należy zwrócić uwagę, że kolekcja Rows zawiera dwie metody: Remove oraz RemoveAt, które wydają się usuwać wiersz całkowicie, ale w rzeczywistości usuwają go tylko z kolekcji. Wyłącznie za pomocą metody Delete można przesłać usunięcie do źródłowej bazy danych. Wklej następujący kod po kodzie WYSYŁANIA ZMIAN DO SERWERA SQL:
    //*****************
    // ROZPOCZĘCIE KODU USUWANIA 
    
    drCurrent = tblAuthors.Rows.Find("993-21-3427");
    drCurrent.Delete();
    Console.WriteLine("Rekord został pomyślnie usunięty. Kliknij dowolny klawisz, aby kontynuować!"); 
    Console.ReadLine();
    
    // ZAKOŃCZENIE KODU USUWANIA 
    					
  9. Prześlij zmiany do serwera SQL, aby usunąć dodany wcześniej rekord. Wklej następujący kod po kodzie USUWANIA:
    //*****************
    // OCZYSZCZANIE SERWERA SQL
    daAuthors.Update(dsPubs, "Authors");
    Console.WriteLine("Serwer SQL został zaktualizowany pomyślnie. Sprawdź zmiany przy użyciu eksploratora serwera.");
    Console.ReadLine();
    					
  10. Zapisz projekt.
  11. W menu Debug kliknij polecenie Start, aby uruchomić projekt. Zwróć uwagę na kilka pojawiających się pól komunikatu, które wskazują na postęp w wykonywaniu kodu i umożliwiają śledzenie bieżącego stanu danych w miarę wykonywania programu.

Pełny kod programu

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;

            // Zmodyfikuj następujący ciąg w celu prawidłowego połączenia się z programem SQL Server.
            sConnectionString = "Password=;User ID=sa;"
                + "Initial Catalog=pubs;"
                + "Data Source=(local)";

            SqlConnection objConn
                = new SqlConnection(sConnectionString);
            objConn.Open();

            // Utworzenie wystąpienia obiektu DataAdapter.
            SqlDataAdapter daAuthors 
                = new SqlDataAdapter("Select * From Authors", objConn);

            // Utworzenie wystąpienia obiektu DataSet i pobranie 
            // danych z tabeli Authors.
            DataSet dsPubs = new DataSet("Pubs");
            daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
            daAuthors.Fill(dsPubs,"Authors"); 
            //****************
            // ROZPOCZĘCIE KODU DODAWANIA 
            // Utworzenie nowego wystąpienia obiektu DataTable.
            DataTable tblAuthors;
            tblAuthors = dsPubs.Tables["Authors"];

            DataRow drCurrent;
            // Uzyskanie nowego obiektu DataRow z obiektu DataTable.
            drCurrent = tblAuthors.NewRow();

            // Ustawienie potrzebnych wartości pól obiektu DataRow.
            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;

            // Przekazanie tego nowego obiektu do metody Add obiektu DataTable.
            tblAuthors.Rows.Add(drCurrent);
            Console.WriteLine("Dane zostały dodane pomyślnie. Kliknij dowolny klawisz, aby kontynuować!");
            Console.ReadLine();

            // ZAKOŃCZENIE KODU DODAWANIA   
            //*****************
            // ROZPOCZĘCIE KODU EDYCJI 

            drCurrent = tblAuthors.Rows.Find("213-46-8915");
            drCurrent.BeginEdit();
            drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3);
            drCurrent.EndEdit();
            Console.WriteLine("Edycja rekordu zakończona powodzeniem. Kliknij dowolny klawisz, aby kontynuować!");
            Console.ReadLine();
			
            // ZAKOŃCZENIE KODU EDYCJI   
            //*****************
            // ROZPOCZĘCIE PRZESYŁANIA ZMIAN DO SERWERA SQL 

            SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors);
            daAuthors.Update(dsPubs, "Authors");
            Console.WriteLine("Serwer SQL został zaktualizowany pomyślnie. Sprawdź zmiany przy użyciu eksploratora serwera.");
            Console.ReadLine();
			
            // ZAKOŃCZENIE PRZESYŁANIA ZMIAN DO SERWERA SQL 
            //*****************
            // ROZPOCZĘCIE KODU USUWANIA 

            drCurrent = tblAuthors.Rows.Find("993-21-3427");
            drCurrent.Delete();
            Console.WriteLine("SRekord został pomyślnie usunięty. Kliknij dowolny klawisz, aby kontynuować!"); 
            Console.ReadLine();
       
            // ZAKOŃCZENIE KODU USUWANIA  
            //*****************
            // OCZYSZCZANIE SERWERA SQL
            daAuthors.Update(dsPubs, "Authors");
            Console.WriteLine("Serwer SQL został zaktualizowany pomyślnie. Sprawdź zmiany przy użyciu eksploratora serwera.");
            Console.ReadLine();         	
			
        }
    }
}
				

Materiały referencyjne

Więcej informacji dotyczących korzystania z usługi ADO.NET, obiektów DataSet i języka SQL można znaleźć w następujących witrynach sieci Web firmy Microsoft:
Diving into Data Access (Zagadnienia związane z dostępem do danych) (MSDN Voices)
http://msdn.microsoft.com/columns/
ADO.NET for the ADO Programmer (Omówienie środowiska ADO.NET dla programistów korzystających z obiektów ADO)
http://msdn2.microsoft.com/en-us/library/ms973217.aspx
MSDN Online .NET Developer Center (Centrum online deweloperów .NET w sieci MSDN)
http://msdn.microsoft.com/net

Właściwości

Numer ID artykułu: 307587 - Ostatnia weryfikacja: 19 marca 2007 - Weryfikacja: 6.2
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Słowa kluczowe: 
kbhowtomaster kbsqlclient kbsystemdata KB307587

Przekaż opinię

 

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