БлогNot. Visual С++ в Studio Expess: подключаемся к файлу Access

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 [17582 просмотра]


теги: access c++/cli

показать комментарии (2)