Базы данных и 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.

