Базы данных и XML
Особенности разных СУБД
При работе с определенной СУБД необходимо учитывать ее особенности. С этой целью вводится понятие "провайдер данных" – у каждой СУБД он свой. С точки зрения программиста провайдер данных — это набор классов, обеспечивающих связь с базой и осуществляющих доступ к данным. Так, например, за связь с базой данных Microsoft SQL Server отвечает класс SqlConnection, а за связь с базой данных Access — OleDbConnection. Первый является частью провайдера данных SQLDataProvider, второй — провайдера данных OLEDbProvider.
Программный код меняется в зависимости от того, с какой базой предстоит работать. Для демонстрации возможностей использования баз данных, работающих под управлением различных СУБД, мы создали базу данных Planets в Microsoft SQL Server и в Access. Поскольку формат базы данных в Access 2007 отличается от формата, принятого в предыдущих версиях, реализация выполнена для версий Access 2007 и Access 2003. Естественно, что все особенности построения баз данных находят отражение в программном коде.
Три варианта базы данных Planets помещены в каталог с именем databases. Файлы Planets.mdf и Planets.ldf, задают базу данных SQL Server, файл Planets.accdb создан для базы данных Access 2007, а Planets.mdb — для базы данных Access 2003.
В программном коде указывается путь к файлам базы данных, поэтому папка databases должна находиться в том же каталоге, где находится программа, задающая решение, — в нашем случае это файл Examples.sln.
При работе с базой данных SQL Server программный код зависит от того, с какой версией СУБД приходится работать — с Microsoft SQL Server или Microsoft SQL Server Express Edition.
В приведенном ниже примере показаны четыре возможных варианта работы:
- работа с Microsoft SQL Server Express Edition;
- работа с Microsoft SQL Server;
- работа с Access 2003;
- работа с Access 2007.
Три варианта закомментированы, а один готов к использованию, в данном тексте это вариант работы с Microsoft SQL Server. В зависимости от того, что установлено на компьютере читателя, следует нужный вариант раскомментировать, а ненужный — закомментировать.
У большинства пользователей на компьютерах установлен комплект Microsoft Office, возможно, в нем имеется и приложение Access, так что для начала можно поработать с базами данных, подготовленными в этом приложении.
Когда вам понадобятся более широкие возможности программирования, мы рекомендуем вам установить SQL Server Express. К тому же умение работать с SQL Server гораздо выше ценится в деловой сфере, и чем скорее вы освоите этот инструмент, тем лучше. Загрузить его можно бесплатно с сайта Microsoft: http://www.microsoft.com/.
Обращение к базам данных из программы, написанной на языке C#
Далее в трех примерах программ на C# мы будем использовать классы Connection, Command, DataReader, DataAdapter. Префиксы Sql и OleDb указывают на то, с каким вариантом базы данных Planets мы работаем.
Пример программы 4.1
Следующая программа подключается к базе данных и посылает ей SQL-запрос. Затем выполняется несколько циклов получения результата запроса, после чего полученные результаты передаются в элемент управления ListBox и отображаются в списке.
using System.Windows.Forms; using System.Data; // Пространство имен для работы с базами данных SQL Server using System.Data.SqlClient; using System.Drawing; // Пространство имен для работы с базами данных Access using System.Data.OleDb; class SimpleDataAccess : Form { public SimpleDataAccess() { // Указываем заголовок окна this.Text = "Работа с базой данных. Чтение данных."; // Добавляем элементы управления - метку и список Label labelCaption = new Label(); labelCaption.Text = "Планеты солнечной системы!"; labelCaption.Location = new Point(30, 10); labelCaption.Width = 200; labelCaption.Parent = this; ListBox listPlanets = new ListBox(); listPlanets.Location = new Point(30, 50); listPlanets.Width = 100; listPlanets.Parent = this; // Формируем запрос к базе данных - //запрашиваем информацию о планетах string sql = "SELECT * FROM PLANET"; string connectionString; /* //Вариант 1 // Подключаемся к базе данных SQL Server Express Edition // Указываем физический путь к базе данных PLANETS string dbLocation = ("../../../databases/planets.mdf"); connectionString = @"data source=.\SQLEXPRESS;" + "User Instance=true;Integrated Security=SSPI;" + "AttachDBFilename=" + dbLocation; SqlConnection connection1 = new SqlConnection(connectionString); */ //Вариант 2 // Подключаемся к базе данных SQL Server 2005 connectionString = "data source = localhost; Initial Catalog = Planets;" + "Integrated Security = SSPI"; SqlConnection connection1 = new SqlConnection(connectionString); //Открываем соединение connection1.Open(); SqlCommand command1 = new SqlCommand(sql, connection1); SqlDataReader dataReader1 = command1.ExecuteReader(); // Организуем циклический перебор полученных записей //и выводим название каждой планеты в список while (dataReader1.Read()) { listPlanets.Items.Add(dataReader1["PlanetName"]); } // Очистка dataReader1.Close(); connection1.Close(); /* //Вариант 3. Связывание с базой данных Access 2003 - *.mdb connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source= ../../../databases/planets.mdb"; //Вариант 4. Связывание с базой данных Access 2007 - *.accdb connectionString = "Provider=Microsoft.Ace.OLEDB.12.0;" + @"Data Source= ../../../databases/planets.accdb"; OleDbConnection connection = new OleDbConnection(connectionString); connection.Open(); OleDbCommand command = new OleDbCommand(sql, connection); OleDbDataReader dataReader = command.ExecuteReader(); // Организуем циклический перебор полученных записей //и выводим название каждой планеты в список while (dataReader.Read()) { listPlanets.Items.Add(dataReader["PlanetName"]); } // Очистка dataReader.Close(); connection.Close(); * */ } static void Main() { // Создаем и запускаем форму Application.Run(new SimpleDataAccess()); } }Листинг 4.1.
Пример программы 4.2
В этой программе на экран выводится несколько столбцов данных. Для их представления мы воспользуемся элементом DataGridView.
Программа выполняет тот же запрос, что и в предыдущем примере, но помещает результат в объект DataSet, который подключается к элементу управления DataGridView, а тот автоматически отображает все данные.
Подключение источника данных к визуальному элементу управления называется привязкой, или связыванием данных.
using System.Windows.Forms; using System.Data; // Пространство имен для работы с базами данных SQL Server using System.Data.SqlClient; using System.Drawing; // Пространство имен для работы с базами данных Access using System.Data.OleDb; class DataInGrid : Form { public DataInGrid() { //Изменяем размеры формы this.Width = 450; this.Height = 400; // Указываем заголовок окна this.Text = "Одностороннее связывание:" + " база данных и элемент Grid."; // Добавляем элементы управления - метку и таблицу Label labelCaption = new Label(); labelCaption.Text = "Планеты солнечной системы!"; labelCaption.Location = new Point(60, 10); labelCaption.Width = 200; labelCaption.Parent = this; // Добавляем элемент DataGridView на форму DataGridView dataGridView1 = new DataGridView(); dataGridView1.Width = 350; dataGridView1.Height = 250; dataGridView1.Location = new Point(20, 50); dataGridView1.DataMember = "Table"; dataGridView1.AutoResizeColumns(); this.Controls.Add(dataGridView1); // Формируем запрос к базе данных - //запрашиваем информацию о планетах string sql = "SELECT * FROM PLANET"; string connectionString; // DataSet сохраняет данные в памяти //данные хранятся в виде таблиц данных DataTable DataSet dataSet1 = new DataSet(); /* //Вариант 1 // Подключаемся к базе данных SQL Server Express Edition // Указываем физический путь к базе данных PLANETS string dbLocation = ("../../../databases/planets.mdf"); connectionString = @"data source=.\SQLEXPRESS;" + "User Instance=true;Integrated Security=SSPI;" + "AttachDBFilename=" + dbLocation; SqlConnection connection1 = new SqlConnection(connectionString); */ /* //Вариант 2 // Подключаемся к базе данных SQL Server 2005 connectionString = "data source = localhost; Initial Catalog = Planets;" + "Integrated Security = SSPI"; SqlConnection connection1 = new SqlConnection(connectionString); //Открываем соединение connection1.Open(); // DataAdapter - посредник между базой данных и DataSet SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter(); // Создаем объект DataAdapter, //передаем ему данные запроса sqlDataAdapter1.SelectCommand = new SqlCommand(sql, connection1); // Данные из адаптера поступают в DataSet sqlDataAdapter1.Fill(dataSet1); // Связываем данные с элементом DataGridView DataGridView1.DataSource = dataSet1; // Очистка connection1.Close(); * */ /* //Вариант 3. Связывание с базой данных Access 2003 - *.mdb connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source= ../../../databases/planets.mdb"; */ //Вариант 4. Связывание с базой данных Access 2007 - *.accdb connectionString = "Provider=Microsoft.Ace.OLEDB.12.0;" + @"Data Source= ../../../databases/planets.accdb"; OleDbConnection connection = new OleDbConnection(connectionString); connection.Open(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = new OleDbCommand(sql, connection); dataAdapter.Fill(dataSet1); dataGridView1.DataSource = dataSet1; // Очистка connection.Close(); } static void Main() { // Создаем и запускаем форму Application.Run(new DataInGrid()); } }Листинг 4.2.