Visual С++ в Studio Expess: подключаемся к файлу Access
Visual Studio, как и другие современные среды программирования, поддерживает работу с базой данных (БД) по технологии ADO (то есть, с формированием Connection String), поддерживаются как MS SQL, так и Access. Информация из БД кэшируется в DataSet, который обеспечивает приложение данными.
Работа с системными источниками данных поддерживается только в "полных" версиях Visual Studio, но не Express. В этой статье мы рассмотрим лишь работу с СУБД Access, предполагая, что на компьютере установлен Microsoft Office версий XP/2003 или выше. По поводу подключения к "обычным" SQL'евским базам могу, например, посоветовать главу 12 из книги Б. Пахомова "С, С++ и MS Visual C++ 2010 для начинающих".
Сначала нужно подготовить и сохранить в папке проекта (если создано решение с одним проектом и оно называется bd1
, то папка будет bd1/bd1
) тестовый файл Access:
- имя файла =
db1.mdb
(на всякий случай, сохранил совместимым с версиями XP/2003); - имя таблицы =
Table1
; - в таблице три поля с типам Счетчик (имя
Id
), Текст (имяName
), Числовой (имяNumber
).
Добавить в Studio отключённые по умолчанию компоненты: правая кнопка на Панели элементов, команда Выбрать элементы... , вкладка Компоненты .NET Framework, добавить OleDbConnection
, OleDbDataAdapter
(появятся в группе "Данные" панели элементов). Если у вас версия Express, которая часто грешит "глюками" с отображением списка компонентов, попробуйте сбросить панель элементов в исходное состояние (тоже правой кнопкой мыши) и повторить операцию.
Перенести компонент OleDbDataAdapter
на форму, появится мастер подключения, показать на заранее подготовленный файл Access, при запросе строки SQL ввели
select * from Table1
Проверить, что на форме создалось OleDbConnection
.
В норме
OleDbDataAdapter
должен создать команды для действий SELECT, INSERT, UPDATE и DELETE. Но, возможно, в зависимости от версии офиса, придётся дополнительно настраивать свойства oleDbDataAdapter1 - SelectCommand - CommandText и oleDbDataAdapter1 - UpdateCommand - CommandText.Это можно сделать как в диспетчере свойств, например, написав в свойстве oleDbDataAdapter1 - SelectCommand - CommandText:
SELECT Table1.* FROM Table1так и программно (настраиваем UpdateCommand):
System::Data::OleDb::OleDbCommand ^ command = gcnew System::Data::OleDb::OleDbCommand ( "UPDATE Table1 SET Id = ?, Name = ?, Number = ? WHERE Id = ?", oleDbConnection1); command->Parameters->Add ( "Id", System::Data::OleDb::OleDbType::UnsignedInt, sizeof(System::Data::OleDb::OleDbType::UnsignedInt), "Id"); command->Parameters->Add ( "Name", System::Data::OleDb::OleDbType::VarChar, 20, "Name"); command->Parameters->Add ( "Number", System::Data::OleDb::OleDbType::Decimal, 10, "Number"); oleDbDataAdapter1->UpdateCommand = command;Возможно (как альтернатива) настроить все команды "автоматически", для этого щелкните по стрелочке в правом верхнем углу значка oleDbDataAdapter1 и выберите "Настроить адаптер данных". Помешать автонастройке может отсутствие запущенного сервера SQL.
Все остальные компоненты тоже "лежат" в списке "Данные":
- Добавить DataGridView, DataSet - для обеспечения подключения.
- Добавить BingingNavigator - для навигации по БД.
- Добавить BingingSource - для связи источника данных с навигатором.
В свойствах DataSet выбрать свойство Tables, добавить одну таблицу Table1, в окне Редактор коллекции столбцов (вызывать из свойства Columns) добавить 3 столбца с именами как в файле Access (Id, Name, Number). Для каждого столбца указать свойства:
- ColumnName - имя столбца из Access,
- DataType - тип данных из Access (счетчик как Int32)
В свойствах bingingSource1 указать DataSource = dataSet1, DataMember = Table1
Для bindingNavigator указать bindingSource = bindingSource1
Для dataGridView указать DataSource = bindingSource1 (неправильно DataSource=dataSet1, DataMember=Table1, как я видел в инете)
Для oleDbDataAdapter1 проверить свойство SelectCommand - Connection = oleDbConnection1
По некоторому событию (например, по загрузке формы Load
) получим данные из таблицы БД:
oleDbDataAdapter1->Fill (dataTable1);
Перед закрытием формы (событие FormClosing
) сохраним изменения в таблице Access:
oleDbDataAdapter1->Update (dataTable1); //Свойство (Name) при "ручном" добавлении таблицы в dataSet1 //осталось = dataTable1 независимо от имени таблицы (TableName)
или (надёжнее)
oleDbDataAdapter1->Update (dataSet1->Tables["Table1"]);
Можно всё делать и программно, а не тыкать свойства. Вот пример кода с программным коннектом к базе данных Access.
dataSet1->Tables->Add("Search"); dataSet1->Tables["Search"]->Columns->Add ("Name"); String ^SQL="Select Name from table1 where (Name='Petrov')"; auto Connection = gcnew Data::OleDb::OleDbConnection ( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"); Connection->Open(); auto Command = gcnew Data::OleDb::OleDbCommand (SQL,Connection); //Есть путь: int i=Command->ExecuteNonQuery(); Connection->Close(); auto Reader = Command->ExecuteReader(System::Data::CommandBehavior::CloseConnection); while (Reader->Read()) { dataSet1->Tables["Search"]->Rows->Add(Reader->GetValue(0)); } Reader->Close(); bindingSource1->DataSource = dataSet1; bindingSource1->DataMember = "Search"; bindingNavigator1->BindingSource = bindingSource1; bindingNavigator1->Update(); dataGridView1->DataSource = bindingSource1; oleDbDataAdapter1->Fill (dataSet1->Tables["Search"]);
Скачать проект-пример Visual C++ в архиве .zip (26 Кб)
28.03.2015, 13:54 [17864 просмотра]