Опубликован: 14.12.2009 | Уровень: для всех | Доступ: платный
Лекция 6:

Базы данных и XML

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Особенности разных СУБД

При работе с определенной СУБД необходимо учитывать ее особенности. С этой целью вводится понятие "провайдер данных" – у каждой СУБД он свой. С точки зрения программиста провайдер данных — это набор классов, обеспечивающих связь с базой и осуществляющих доступ к данным. Так, например, за связь с базой данных 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.

В приведенном ниже примере показаны четыре возможных варианта работы:

  1. работа с Microsoft SQL Server Express Edition;
  2. работа с Microsoft SQL Server;
  3. работа с Access 2003;
  4. работа с 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.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Алексей Фролов
Алексей Фролов
Кристина Горбунова
Кристина Горбунова
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989