Простая база данных фильмов на C# с использованием Microsoft Access



В этой небольшой статье я хочу рассказать тебе про написание простейшей база данных фильмов, или проще говоря, видео каталога, при помощи C# и Microsoft Access. В статье я рассмотрю все необходимые моменты: подключение к программе mdb файла, чтение/запись данных с использованием dataGridView и т.д.

Лепим приложение

Первым делом, тебе необходимо создать базу данных в Microsoft Access. База данных очень проста, поэтому у тебя есть непаханое поле для экспериментов и совершенствования.

//  Первая таблица будет содержать фильмы
//  где movieID является авто-увеличивающимся значением, также primary key //(главным ключом), и typeID вторичным ключом (foreign key)
//  movies (movieID, Title, Publisher, Previewed, Year, typeID) 
//  --------------------------------------------------------------- 
//  Вторая таблица будет хранить жанры фильмов
//  movietypes (typeID, Type)

Если ты сразу планируешь создать большую базу, то воспользуйся каким-нибудь генератором базы данных. Для небольшого проекта, такого как этот, в применение таких инструментов нет необходимости.

Ok, теперь у нас есть база данных. Можно двигаться дальше. Microsoft Access позволяет добавлять записи, но мы хотим создавать их из своего приложения. Для решения этой задачи мы воспользуемся пространством имен System.Data.OleDB. В нем есть все необходимые методы для соединения с базой данных и манипуляцией имеющимся в ней данными.

В конструкторе основной формы, приложение соединяется с базой данных при помощи следующего кода:

public Form1()
{
    InitializeComponent();
    // initiate DB connection
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
        Data Source=moviedb.mdb";
    try
    {
        database = new OleDbConnection(connectionString);
        database.Open();
        //SQL query to list movies
        string queryString = "SELECT movieID, Title, 
            Publisher, Previewed, Year, Type 
            FROM movie,movieType WHERE movietype.typeID = movie.typeID";
        loadDataGrid(queryString);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

Метод loadDataGrid загружает данные из базы данных в компонент dataGridView, при помощи SQL запроса, записанного в строковой переменной queryString. Реализация ниже:

public void loadDataGrid(string sqlQueryString) {
 
            OleDbCommand SQLQuery = new OleDbCommand();
            DataTable data = null;
            dataGridView1.DataSource = null;
            SQLQuery.Connection = null;
            OleDbDataAdapter dataAdapter = null;
            dataGridView1.Columns.Clear(); // <-- clear columns
 
            SQLQuery.CommandText = sqlQueryString;
            SQLQuery.Connection = database;
            data = new DataTable();
            dataAdapter = new OleDbDataAdapter(SQLQuery);
            dataAdapter.Fill(data);
            dataGridView1.DataSource = data;
 
            dataGridView1.AllowUserToAddRows = false; // <-- remove the null line
            dataGridView1.ReadOnly = true;          // <-- so the user cannot type 
 
            // following code defines column sizes
            dataGridView1.Columns[0].Visible = false; 
            dataGridView1.Columns[1].Width = 340;
            dataGridView1.Columns[3].Width = 55;
            dataGridView1.Columns[4].Width = 50;
            dataGridView1.Columns[5].Width = 80;
 
            // insert edit button into datagridview
            editButton = new DataGridViewButtonColumn();
            editButton.HeaderText = "Edit";
            editButton.Text = "Edit";
            editButton.UseColumnTextForButtonValue = true;
            editButton.Width = 80;
            dataGridView1.Columns.Add(editButton);
 
            // insert delete button to datagridview
            deleteButton = new DataGridViewButtonColumn();
            deleteButton.HeaderText = "Delete";
            deleteButton.Text = "Delete";
            deleteButton.UseColumnTextForButtonValue = true;
            deleteButton.Width = 80;
            dataGridView1.Columns.Add(deleteButton);
        }

Интересной частью этого кода является добавление кнопок в ячейки dataGridView. При помощи этих кнопок, ты сможешь обновлять или изменять выделенные строки. Если тебе не нравится вариант с кнопками для каждой строки, то можешь создать всего лишь две кнопки (вне компонента dataGridView) и забиндить на них редактирование и удаление записей для выделенной строки. Для своего примера я использую первый способ.

Теперь нам нужно найти ответ на один интересный вопрос: «Как узнать когда нажали кнопку в определенной ячейке и собственно как повесить на эти кнопки код обработчика событий?». Мой пример решения ниже:

private void dataGridView1_CellContentClick
    (object sender, DataGridViewCellEventArgs e)
{
    string queryString = "SELECT movieID, Title, Publisher, 
        Previewed, Year, Type 
        FROM movie, movieType WHERE movietype.typeID = movie.typeID";
 
    int currentRow = int.Parse(e.RowIndex.ToString());
    try
    {
        string movieIDString = dataGridView1[0, currentRow].Value.ToString();
        movieIDInt = int.Parse(movieIDString);
    }
    catch (Exception ex) { }
    // edit button
    if (dataGridView1.Columns[e.ColumnIndex] == editButton && currentRow >= 0)
    {
        string title = dataGridView1[1, currentRow].Value.ToString();
        string publisher = dataGridView1[2, currentRow].Value.ToString();
        string previewed = dataGridView1[3, currentRow].Value.ToString();
        string year = dataGridView1[4, currentRow].Value.ToString();
        string type = dataGridView1[5, currentRow].Value.ToString();
 
        Form2 f2 = new Form2();
        f2.title = title;
        f2.publisher = publisher;
        f2.previewed = previewed;
        f2.year = year;
        f2.type  = type;
        f2.movieID = movieIDInt;
        f2.Show();
        dataGridView1.Update();
    }
... 

Как видишь, я использую событие CellContentClick. После того как выполнено нажатие кнопки, мне необходимо узнать выделенную строку. Я получаю индекс это на основании e.RowIndex. Используя эту переменную, ты можешь получить значение любой колонки выделенной строки. Как и было показано, первый параметр – это номер колонки, а второй – номер строки. Когда обновление выделенной строки завершается в Form2, я вызываю метод Update() на объекте dataGridView1, тем позволяя сразу увидеть изменения, которые были сделаны.

Кнопка «Удалить» работает по такому же принципу:

// delete button
else if (dataGridView1.Columns[e.ColumnIndex] == 
deleteButton && currentRow >= 0)
{
    // delete SQL query
    string queryDeleteString = 
        "DELETE FROM movie WHERE movieID = "+movieIDInt+"";
    OleDbCommand sqlDelete = new OleDbCommand();
    sqlDelete.CommandText = queryDeleteString;
    sqlDelete.Connection = database;
    sqlDelete.ExecuteNonQuery();
    loadDataGrid(queryString);
}

Mission Completed

Пример, рассмотренный в статье достаточно прост. Все остальные доработки и совершенствования ложатся на твои могучие плечи. Если после прочтения у тебя возникли трудности с реализацией примера, то обязательно скачай мои исходники и хорошенько их изучи.

Автор: Ivan Svogor
Оригинал статьи: ]]>http://www.codeproject.com/KB/cs/simple_movie_database.aspx]]>

Автор перевода: Игорь Антонов aka Spider_NET
E-mail:

ВложениеРазмер
MovieDB.zip303.41 КБ