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
(http://support.microsoft.com/kb/314145/PL/
)
JAK: Wypełnianie obiektu DataSet danymi z bazy danych za pomocą programu Visual C# .NET
Niektóre z zagadnień poruszonych w artykule
314145
(http://support.microsoft.com/kb/314145/PL/
)
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:
- Uruchom program Visual Studio 2005 lub Visual Studio .NET.
- 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().
- 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;
- 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
(http://support.microsoft.com/kb/314145/PL/
)
. 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");
- 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
- 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
- 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
- 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
- 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();
- Zapisz projekt.
- 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();
}
}
}
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:
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
| kbhowtomaster kbsqlclient kbsystemdata KB307587 |