ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.01.2024
Просмотров: 31
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Использование БД Access в приложения на C#
В данной работе будет продемонстрирован один из способов подключения базы данных Access к приложению на C#, а также выполнение некоторых запросов к базе данных.
Первым делом создадим тестовую базу данных для подключения, она будет состоять из одной таблицы.
После этого перейдем непосредственно к проектированию формы в Visual Studio. В нашем случае используется версия 2015 года.
Для начала создадим форму для вывода информации в разном виде:
На форме размещены объекты button, label, dataGridView и listBox. По нажатию на кнопку «Отобразить» все данные из нашей таблицы должны появиться в объекте dataGridView. Перейдем к коду кнопки.
Для начала укажем пространство имен для работы с базой данных Access. Для этого в самом начале кода пропишем следующую команду:
После этого переходим в процедуру нажатия кнопки, в которой в первую очередь необходимо создать строку подключения. Для этого создаем строковую переменную «constr» и присваиваем ей следующее значение:
string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\HomePC\Desktop\forC#.accdb;";
После Data Source = необходимо указать полный путь в базе данных.
После этого создадим экземпляр класса OleDbConnection, который будет отвечать за соединение с базой данных:
OleDbConnection connection = new OleDbConnection(constr);
В качестве параметра конструктора передаем нашу строку подключения «constr».
Теперь необходимо создать переменную, которая будет содержать запрос к базе данных, который вернет все информацию из таблицы TestTable:
string quary = "SELECT * FROM TestTable";
Создадим переменную тип OleDataAdapter, которая получит результат запроса, и переменную типа DataTable, в которую будут записаны данные:
OleDbDataAdapter adapter = new OleDbDataAdapter(quary, constr);
DataTable dt = new DataTable();
В первом случае мы использовали перегрузку конструктора класса OleDbDataAdapter, которая принимает два параметра: строку запроса и строку подключения.
После этого для выполнения запроса к БД нужно открыть соединение:
connection.Open();
Следующая команда заполнит переменную dt информацией, которую вернет запрос, а затем закроет соединение:
adapter.Fill(dt);
connection.Close();
После этого нам остается только назначить в качестве источника данных для dataGridView наш объект dt:
dataGridView1.DataSource = dt;
Полный код кнопки представлен ниже:
В результате мы получим:
Но на деле не всегда нужно выводить всю информацию из таблиц, и не всегда вывод должен быть осуществлен в компонент dataGridView. Следующий код вернет только список имен из таблицы базы данных и заполнит ими объект listBox:
Обратите внимание, что почти весь код остался без изменений, за исключением выделенного зеленой рамкой. Объект dt типа DataTable представляет собой таблицу, состоящую из строк и столбцов, нумерация начинается с нуля. То есть после заполнения переменной dt данными из запроса, таблица состоит из одного столбца (индекс 0) и множества строк.
Переменная row в данном случае обозначает строки таблицы dt, а чтобы их вывести, необходимо указать номер столбца, содержащего данные. Результат показан на рисунке ниже:
Но что, если нам нужно просмотреть каждую запись таблицы по отдельности? Для демонстрации этого примера добавим в наш проект новую форму.
Затем добавим на первую форму кнопку и запрограммируем ее на открытие формы 2.
После этого запрограммируем кнопку «Заполнить». Изначально она будет выводить первую запись из таблицы.
Как и в предыдущих примерах основная часть кода остается неизменной, кроме вывода информации в объекты textBox. Так же обратите внимание, что переменную dt мы сделали глобальной. Это нужно для того, чтобы мы могли обращаться к ней из других процедур, а именно кнопок переключения записей. Кроме того, мы добавили глобальную переменную count, в которую записывается количество строк переменной dt. Коды кнопок «>» и «<» представлены соответственно ниже:
Была добавлена глобальная переменная note, которая хранит номер выведенной записи.
Все предыдущие примеры демонстрируют работу с запросами на выборку. Попробуем теперь внести информацию в базу данных из формы приложения, для этого добавим на форму 2 соответствующие кнопки.
Для кнопки «Добавить» свойству Enabled установим значение false, чтобы случайно на нее не нажать, пока не создастся новая запись. Кнопка «Новая запись» будет просто отчищать поля для ввода.
Обратите внимание, что для свойства Enabled объекта textBox1 мы установили значение false, чтобы в него невозможно было ничего ввести. Это связанно с тем, что в базе данных поле id имеет тип данных Счетчик и его значение устанавливается автоматически. Поэтому указывать его вручную нельзя.
Запрограммируем кнопку «Добавить»:
Строка подключения, переменные connection и quary остаются без изменений (за исключением текста запроса), а вот дальше привычный объект класса OleDbDataAdapter отсутствует, а вместо него появился новый объект OldeDbCommand, конструктор которого принимает те же параметры (quary, connection). Для выполнения запроса используется метод ExecuteNonQuery, который не принимает параметры и ничего не возвращает.
Обратите внимание, что операторы выполнения запроса помещены в конструкцию try-catch-finally. Данную конструкцию рекомендуется использовать при выполнении любой операции, связанной с базой данных. Конкретно в данном случае приложение попытается выполнить запрос; если же в ходе выполнения возникнут ошибки, то блок catch выведет сообщение с текстом ошибки. В конце, не зависимо от того, выполнится команда или появится сообщение об ошибке, соединение будет закрыто.
Результат мы сможем увидеть непосредственно на первой форме, заполнив объект dataGridView:
Создание пользовательского класса для работы с БД Access
Как вы заметили, в процедурах, связанных с выполнением запросов, большая часть кода одинаковая. В проектах, где таких процедур в разы больше, целесообразно создать отдельный класс, в котором описать методы для выполнения запросов на выборку и изменение данных, что существенно сократит код. Класс нужно создать в файле Program.
Наш класс будет содержать всего два поля и два метода. Полный код представлен ниже:
public class doAccess
{
static string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\HomePC\Desktop\forC#.accdb;";
static OleDbConnection connection = new OleDbConnection(constr);
//Запросы на выборку
public DataTable Select(string query)
{
OleDbDataAdapter adapter = new OleDbDataAdapter(query, connection);
DataTable dt = new DataTable();
try
{
connection.Open();
adapter.Fill(dt);
}
catch (System.Exception exp)
{
MessageBox.Show(exp.Message);
connection.Close();
return null;
}
connection.Close();
return dt;
}
//Запросы на изменение
public void Change (string query)
{
OleDbCommand cmd = new OleDbCommand(query, connection);
try
{
connection.Open();
cmd.ExecuteNonQuery();
}
catch (System.Exception exp)
{
MessageBox.Show(exp.Message);
}
finally
{
connection.Close();
}
}
}
Благодаря этому классу код первой формы очень сократился:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Program.doAccess myDB = new Program.doAccess();
//Заполнение dataGridView
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = myDB.Select("SELECT * FROM TestTable");
}
//Заполнение listBox
private void button2_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
foreach (DataRow row in myDB.Select("SELECT FirstName FROM TestTable").Rows)
{
listBox1.Items.Add(row[0].ToString());
}
}
//Открытие второй формы
private void button3_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
}
Здесь мы создали объект нашего класса myDB, с помощью которого обращаемся к методам класса.
А так стал выглядеть код кнопок на заполнение и добавление записей второй формы:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//Глобальные переменные
Program.doAccess myDB = new Program.doAccess();
static DataTable dt = new DataTable();
int count;
//Заполнение формы начальными данными
private void button3_Click(object sender, EventArgs e)
{
dt = myDB.Select("SELECT * FROM TestTable");
textBox1.Text = dt.Rows[0]["id"].ToString();
textBox2.Text = dt.Rows[0]["FirstName"].ToString();
textBox3.Text = dt.Rows[0]["Status"].ToString();
count = dt.Rows.Count;
label4.Text = string.Format("Запись: {0}/{1}", note + 1, count);
}
//Добавление новой записи
private void button5_Click(object sender, EventArgs e)
{
myDB.Change(string.Format("INSERT into TestTable (FirstName, Status) VALUES ('{0}','{1}')", textBox2.Text, textBox3.Text));
button5.Enabled = false;
textBox1.Enabled = true;
}
}