Технология Microsoft ADO .NET

Подключение к базе данных Microsoft Access

Разбить на страницы
Показывать лекцию целиком
Внимание! Для работы с лекциями 3, 4 необходимы учебные файлы, которые Вы можете загрузить здесь.

Подключение к базе данных Microsoft Access

Связывание элементов управления с данными

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

Создайте новое Windows-приложение. Назовите его "DataTextBox". Переходим на вкладку Data панели инструментов Toolbox и перетаскиваем oleDbDataAdapter. В запустившемся мастере устанавливаем подключение к файлу Microsoft Access "BDTur_firm.mdb" и выбираем все поля таблицы "Туристы". В свойствах oleDbDataAdapter1 на информационной панели нажимаем "Generate Dataset". Называем его "dsTourists". Переходим в код формы, подключаем пространство имен:

using System.Data.OleDb;

В конструкторе формы после InitializeComponent вызываем метод Fill объекта oleDbDataAdapter:

oleDbDataAdapter1.Fill(dsTourists1);

Переключаемся в режим дизайна. Располагаем на форме Label и TextBox. В свойстве Text элемента label вводим "Фамилия", в этом же свойстве элемента textBox оставляем пустую строку. Свойству Size формы устанавливаем значение 300; 100.

Щелкаем на знак (+) свойства DataBindings элемента управления textBox. В значении поля Text этой группы снова щелкаем на знак (+) около элемента dsProvider и выбираем поле "Фамилия" (рис. 3.1):

(рис 3.1) Связывание элемента textBox с данными

Запускаем приложение. Теперь в текстовое поле выводится первое значение столбца "Фамилия" (рис. 3.2):

(рис 3.2) Готовая форма

В программном обеспечении к курсу вы найдете приложение DataTextBox (Code\Glava2\ DataTextBox).

Теперь рассмотрим связывание элементов управления с данными, осуществляемое программным образом. Создайте новое Windows-приложение. Назовите его "DataBindings". На создавшейся форме располагаем по четыре элемента TextBox и Label (рис. 3.3):

(рис 3.3) Расположение элементов на форме

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

Код туриста - txtID
Фамилия - txtLastName
Имя - txtFirstName
Отчество - txtMiddleName.

Далее подключаем пространство имен:

using System.Data.OleDb;

Задаем строки подключения:

string сommandText = "SELECT Имя, [Код туриста],
 Отчество, Фамилия FROM Туристы"; 
string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
 ";Data Source=""D:\Uchebnik\Code\Glava1\BDTur_firm.mdb"
 ";User ID=Admin;Jet OLEDB:Encrypt Database=False";

Устанавливаем соединение и определяем все необходимые объекты в конструкторе формы:

OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.TableMappings.Add("Table", "Туристы");
dataAdapter.Fill(ds);

Для связывания свойства Text текстового поля txtID с полем "Код туриста" таблицы "Туристы" используем код

txtID.DataBindings.Add("Text", ds, "Туристы.Код туриста");

Аналогично для других текстовых полей:

txtFirstName.DataBindings.Add("Text", ds, "Туристы.Имя");
txtLastName.DataBindings.Add("Text", ds, "Туристы.Фамилия");
txtMiddleName.DataBindings.Add("Text", ds, "Туристы.Отчество");

Обратите внимание на названия соответствующих столбцов. На практике вы никогда не встретите названий столбцов таблицы базы данных, содержащих пробелы между слов, и к тому же на кириллице - это нонсенс. В нашем учебном проекте тем не менее все работает. Почему? Дело в том, что среда Visual Studio .NET поддерживает кодировку Unicode, поэтому теоретически названия переменных и объектов можно давать на русском языке. Вы можете убедиться в этом, переименовав, скажем переменную "connectionString" в "строкаПодключения" а "ds" в "ДатаСет" и запустить приложение - все будет работать. Но если мы будем создавать коммерческое приложение, которое должно будет работать в самых разных условиях, подобный код сам по себе может стать источником многочисленных ошибок. Поэтому давать названия на кириллице не следует. Для ясности изложения, однако, оставим названия столбцов как есть.

Закрываем соединение:

conn.Close();

Запускаем приложение. В текстовых полях выводится соответствующая информация.

Перемещение по записям. Объект CurrencyManager

Продолжим работу над проектом DataBindings. При выводе данных в виде отдельных записей необходимо реализовать возможность перемещения по записям. Это можно сделать с помощью экземпляра класса CurrencyManager. Располагаем на форме четыре кнопки и надпись в ряд следующим образом (рис. 3.4):

(рис 3.4) Расположение кнопок

Устанавливаем следующие свойства элементов управления:

Элемент Name Text
Кнопка btnFirst <<
Кнопка btnPrevious <
Кнопка btnNext >
Кнопка btnLast >>
Надпись lblRecordsPosition

Объявляем экземпляр cmRecords класса CurrencyManager в классе формы:

CurrencyManager cmRecords;

В конструкторе формы Form1 связываем созданный объект cmRecords с таблицей "Туристы" объекта ds:

cmRecords = (CurrencyManager)BindingContext[ds, "Туристы"];

Создаем обработчиков для событий ItemChanged и PositionChanged объекта cmRecords:

cmRecords.ItemChanged+=new ItemChangedEventHandler(cmRecords_ItemChanged);
cmRecords.PositionChanged+=new EventHandler(cmRecords_PositionChanged);

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

DisplayRecordsPosition ();

Создаем этот метод:

private void DisplayRecordsPosition()
{
 lblRecordsPosition.Text = "Запись " + (cmRecords.Position + 1)
  + " из " + cmRecords.Count;
}

Добавляем методы, вызывающие метод DisplayRecordsPosition() в случае наступления событий ItemChanged и PositionChanged:

private void cmRecords_ItemChanged( object sender, ItemChangedEventArgs e)
		{
			DisplayRecordsPosition();
		}
private void cmRecords_PositionChanged( object sender, System.EventArgs e)
		{
			DisplayRecordsPosition();
		}

Добавляем обработчиков для нажатий навигационных кнопок:

private void btnFirst_Click(object sender, System.EventArgs e)
		{
			cmRecords.Position = 0;
		}

private void btnPrevious_Click(object sender, System.EventArgs e)
		{
			cmRecords.Position--;
		}

private void btnNext_Click(object sender, System.EventArgs e)
		{
			cmRecords.Position++;
		}

private void btnLast_Click(object sender, System.EventArgs e)
		{
			cmRecords.Position = cmRecords.Count - 1;
		}

Запускаем приложение. Теперь можно перемещаться по записям (рис. 3.5):

(рис 3.5) Форма с навигационными кнопками

В программном обеспечении к курсу вы найдете приложение DataBindings (Code\Glava2\DataBindings).

Подключение к базе данных Microsoft Access, защищенной паролем. Вскрытие пароля

Файл базы данных Microsoft Access, подобно другим документам Office, можно защитить с помощью пароля на открытие. Скопируйте файл BDTur_firm.mdb, с которым мы работали в первой главе, назовите его "BD_withPassword.mdb". Для установки пароля нам понадобится открыть базу в так называемом монопольном, однопользовательском режиме. Дело в том, что возможность установки пароля при одновременной работе нескольких пользователейMicrosoft Office Access 2003 поддерживает одновременную работу 255 пользователей. приводила бы к ошибкам, поэтому MS Access не предоставляет ее. Запускаем программу, в главном меню переходим "Файл \ Открыть", переходим в нужную директорию, выделяем файл, из выпадающего списка значений кнопки "Открыть" выбираем "Монопольно" (рис. 3.6):

(рис 3.6) Монопольное открытие файла базы данных

Появляется окно базы данных. В главном меню переходим "Сервис \ Защита \ Задать пароль базы данных", в окне "Задание пароля базы данных" вводим пароль "12345" и подтверждаем его (рис. 3.7).

(рис 3.7) Задание пароля базы данных

Теперь всякий раз при открытии этого файла на любом компьютере нужно будет вводить указанный пароль (рис. 3.8).

(рис 3.8) Открывание базы данных с паролем

Для изменения пароля нам потребуется удалить существующий и затем задать новый. Снова открываем базу в монопольном режиме, в главном меню переходим "Сервис \ Защита \ Удалить пароль базы данных". В появившемся окне вводим текущий пароль, после нажатия кнопки "OK" он будет удален. Для ввода нового значения опять переходим к пункту меню "Задать пароль базы данных", на этот раз введем более сложный пароль "q1w2e3r4t5y6u7i8o9p0".

Защита файла с помощью пароля - крайне ненадежный способ, его нельзя применять в реальных приложениях. Пароль хранится в открытом виде, и его очень легко вскрыть. В Интернете множество утилит, предназначенных для этого, например, Access Password Recovery Genie (http://www.lenosoft.com). После запуска этой программы выбираем файл MS Access, пароль к которому нужно подобрать, - и пароль моментально появляется в главном окне (рис. 3.9).

(рис 3.9) Вскрытие пароля файла MS Access

Далее нам снова понадобится вводить пароль - чтобы не тратить время, установите снова его значение равным "12345". Займемся теперь подключением к файлу базы данных из приложений. Конечно, вы теперь будете сомневаться, применять ли вообще задание пароля как средство безопасности, но нам в любом случае нужно научиться подключаться даже к такой, "ненадежной" базе. Создайте новый Windows-проект и назовите его "VisualBD_withPassword". Из окна Toolbox перетаскиваем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Переходим на вкладку Data дважды щелкаем на объекте OleDbDataAdapter. В появившемся мастере настраиваем подключение к файлу BD_withPassword.mdb. Теперь в окне "Свойства связи с данными" при проверке соединения появляется сообщение об ошибке (рис. 3.10):

(рис 3.10) Ошибка проверки подключения, возникающая при отсутствии пароля

Исходя из текста ошибки, возникает естественное желание снять галочку "Пустой пароль" и в поле пароля ввести "12345". Но и на этот раз возникает ошибкаУбедитесь также в том, что ваш файл базы данных не открыт в самой программе Microsoft Access. (рис. 3.11):

(рис 3.11) Ошибка проверки подключения, возникающая при неправильном указании пароля

Дело в том, что интерфейс вкладки "Подключение" предназначен для ввода параметров учетной записи при защите на уровне пользователей. Далее мы рассмотрим ее. Здесь же снова устанавливаем галочку "Пустой пароль" и переходим на вкладку "Все". Дважды щелкаем на свойстве Jet OLEDB:Database Password (или, выделив его, нажимаем на кнопку "Изменить значение"), в появившемся окне "Изменение значения свойства" вводим пароль "12345" (рис. 3.12).

(рис 3.12) Ввод пароля для подключения к базе данных

Переходим на вкладку "Подключение" - наконец нам удалось получить доступ к базе (рис. 3.13).

(рис 3.13) Успешная проверка подключения

Нажимаем кнопку "OK" для закрытия окна "Свойства связи с данными", в следующих шагах мастера "Data Adapter Configuration Wizard" настраиваем извлечение всех записей из таблицы "Туристы". В последнем шаге мастера - включение пароля в строку connection string - выбираем кнопку "Include password"; мы будем изучать строку, сгенерированную мастером (рис. 3.14):

(рис 3.14) Последний шаг мастера - включение пароля в строку connection string

На панели компонент формы выделяем объект DataAdapter, переходим в его окно Properties и нажимаем на ссылку Generate dataset. Оставляем название объекта DataSet, предлагаемое по умолчанию. В конструкторе формы заполняем объект DataSet, а также определяем источник данных для элемента DataGrid:

public Form1()
		{
			InitializeComponent();
			oleDbDataAdapter1.Fill(dataSet11);
			dataGrid1.DataSource = dataSet11.Tables[0].DefaultView;
		}

Здесь мы указываем индекс (равный нулю) единственной таблицы, находящейся в объекте DataSet.

Запускаем приложение. На форму выводятся данные из базы (рис. 3.15):

(рис 3.15) Готовое приложение VisualBD_withPassword

В программном обеспечении к курсу вы найдете приложение VisualBD_ withPassword и файл базы данных MS Access "BD_withPassword.mdb" (Code\Glava2\VisualBD_withPassword и BD_withPassword.mdb).

Сделаем точно такое же приложение без использования визуальных средств студии. Создайте новый Windows-проект, назовите его "ProgrammBD_withPassword". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

using System.Data.OleDb;

В классе формы создаем строки connectionString и commandText:

string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
 ";Data Source=""D:\Uchebnik\Code\Glava2\BD_withPassword.mdb"
 ";User ID=Admin;Jet OLEDB:Database Password=12345;";
string commandText = "SELECT * FROM Туристы";

Мы включили минимум параметров в строку подключения, среди которых указывается пароль базы:

Jet OLEDB:Database Password=12345;

В конструкторе формы создаем все объекты ADO .NET:

public Form1()
	{
		InitializeComponent();
		OleDbConnection conn = new OleDbConnection();
		conn.ConnectionString = connectionString;
		OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
		DataSet ds = new DataSet();
		dataAdapter.Fill(ds);
		dataGrid1.DataSource = ds.Tables[0].DefaultView;
		conn.Close();
	}

В программном обеспечении к курсу вы найдете приложение ProgrammBD_ withPassword (Code\Glava2\ ProgrammBD_withPassword).

Подключение к базе данных Microsoft Access, защищенной на уровне пользователей. Вскрытие учетных записей

Microsoft Access предоставляет средства распределенного доступа к базе данных. С одним файлом могут одновременно работать большое количество пользователей, обладающих разными правами: одни могут только просматривать таблицы, другие - только вносить новые данные, и лишь администраторы базы обладают полным доступом. Когда мы устанавливаем пакет Microsoft Office на локальный компьютер и, ни о чем не задумываясь, начинаем создавать свою базу в программе Access, мы по умолчанию выступаем в роли администратора. Поставим теперь задачу: разделить доступ для двух пользователей - один сможет только просматривать данные (читать), другой по-прежнему будет обладать полным доступом. Скопируйте файл BDTur_firm.mdb и назовите его "BDwithUsers.mdb". Открываем базу, в главном меню программы переходим "Сервис \ Защита \ Мастер" (см. рис. 2.7). Появляется мастер защиты, в первом шаге которого доступен единственный переключатель "Создать файл рабочей группы" ( рис. 3.16):

(рис 3.16) Первый шаг мастера защиты

Файл рабочей группы представляет собой своеобразный электронный ключ, в котором будут храниться созданные настройки. Он имеет расширение *.mdw. В следующем шаге мастера нажимаем кнопку "Обзор" - по умолчанию мы оказываемся в той же директории, где расположен исходный файл базы данных BDwithUsers.mdb, вводим название создаваемого файла BDWorkFile.mdwВ этом шаге мастер предлагает название "Security.mdw" файла рабочей группы. Я предлагаю изменить это название - чтобы в дальнейшем его было легко отличить и не путать с файлами по умолчанию.. Нажимаем кнопку "Выбрать", возвращаясь в окно мастера. Устанавливаем переключатель на значение "Использовать файл рабочей группы по умолчанию". На другие параметры - "Код рабочей группы", "Ваше имя", "Организация" - можно не обращать внимания (рис. 3.17). Нажимаем кнопку "Далее".

(рис 3.17) Определение файла рабочей группы BDWorkFile.mdw

Теперь предстоит определить, какие объекты базы данных защищены. Оставляем все таблицы и нажимаем кнопку "Далее" (рис. 3.18).

(рис 3.18) Определение объектов базы данных, которые будут защищены

Мы добрались до самих рабочих групп. Программа Microsoft Access предлагает несколько рабочих групп, в каждой из которых может быть большое число пользователей. К примеру, пять пользователей могут обладать полными правами, десять - быть разработчиками проекта и еще пять - обладать правами на обновление данных. Код группы также можно не запоминать. Мы выбираем группу "Только чтение", отмечая ее галочкойОбратите внимание, что интерфейс программы предоставляет возможность одновременного выбора нескольких (или всех групп) - нужно просто отметить соответствующие чекбоксы., нажимаем кнопку "Далее" (рис. 3.19).

(рис 3.19) Выбор рабочей группы

Теперь требуется определить права группы Users. Это группа в любом случае будет входить в файл BDWorkFile.mdw; по умолчанию пользователи, входящие в нее, могут работать с базой данных без всякого пароля. Предоставление каких-либо прав этой группе означает предоставление этих же прав любому пользователю. Поэтому из соображений безопасности Microsoft Access предлагает вариант по умолчанию. Изменение этого варианта означает встраивание "черного" входа в файл рабочей группы. Мы оставляем предложенное значение и нажимаем кнопку "Далее" (рис. 3.20):

(рис 3.20) Определение разрешений группы Users

В следующем шаге мастера следует определить пользователей и пароли. Именно эти сведения для каждого пользователя будут постоянно использоваться в работе с приложением, поэтому на них следует обратить внимание. В поле "Пользователь:" вводим "Adonetuser", задаем этому пользователю пароль "12345", нажимаем кнопку "Добавить пользователя в список". Поля "Пользователь" и "Пароль" очищаются, а в списке, расположенном в левой части формы, появляется новая запись. Нажимаем кнопку "Далее" (рис. 3.21).

(рис 3.21) Добавление пользователя "Adonetuser"

Итак, теперь у нас уже есть рабочая группа - "Только чтение", и теперь появился пользователь "Adonetuser". Из выпадающего списка "Группа или пользователь" следует выбрать "Adonetuser" и отметить галочкой группу "Только чтение" (рис. 3.22, А). При выборе второго пользователя из выпадающего списка - здесьКогда я устанавливал операционную систему на компьютере, я ввел свои фамилию и имя в качестве регистрационных данных. Далее, при установке пакета Microsoft Office, эти же сведения были предложены по умолчанию. Если вы хотите изменить эти сведения, лучший способ сделать это - переустановить пакет Microsoft Office. Для изменения регистрационных данных, введенных при установке системы, измените параметры реестра RegisteredOwner и RegisteredOrganization в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Далее, я везде буду писать "Chingiz Kariev", полагая, что вы выполняете действия, подставляя свое значение фамилии и имени. "Chingiz Kariev", - можно заметить, что он входит в группу Admins (рис. 3.22, Б). Это очень важный момент: должен быть хотя бы один пользователь-администратор, входящий в эту группу, в противном случае после завершения работы мастера мы не сможем добавлять новых пользователей и изменять права существующих!

(рис 3.22) Распределение пользователей в рабочие группы. А - включение пользователя "Adonetuser" в группу "Только чтение", Б - вхождение пользователя "Chingiz Kariev" в группу "Admins" по умолчанию

В последнем шаге мастера создается резервная копия базы данных. Она располагается в той же самой директории, где и основная (рис. 3.23). Несмотря на свое расширение - *.bak (backup), это, по сути, обычный файл базы данных Microsoft Access.

(рис 3.23) Создание резервной копии базы данных

При нажатии на кнопку "Готово" появляется отчет, создаваемый мастером защиты. Он включает в себя перечень всех сведений, которые в дальнейшем могут понадобиться для восстановления доступа к базе:

Отчет мастера защиты
Данный отчет содержит все сведения, необходимые для воссоздания 
файла рабочей группы и восстановления доступа к защищенной базе 
данных в случае повреждения. 
Напечатайте или экспортируйте этот отчет и сохраните его в надежном месте.

Незащищенная база данных:
	D:\Uchebnik\Code\Glava2\BDwithUsers.bak
Защищенная база данных:
	D:\Uchebnik\Code\Glava2\BDwithUsers.mdb
Файл рабочей группы:
	D:\Uchebnik\Code\Glava2\BDWorkFile.mdw
Пользователь:
	Microsoft Access
Организация:

Код рабочей группы:
	mx4qX5Gy6OGUgwmOZpt

Защищенные объекты:
	Таблицы:
		Информация о туристах
		Оплата
		Путевки
		Сезоны
		Туристы
		Туры
		<Новые таблицы и запросы>
	Запросы:
		<Новые таблицы и запросы>
	Формы:
		<Новые формы>
	Отчеты:
		<Новые отчеты>
	Макросы:
		<Новые макросы>
	База данных:
		Пароль VBE не установлен
Группы:
	Имя: Только чтение
	Код группы: FecIdp7S4zQTMaV5qAp
	Users: 
	  	Adonetuser
	
	Имя: Admins
	Код группы: <Созданные ранее>
	Users: 
	  	Chingiz Kariev
	
	Имя: Users
	Код группы: <Созданные ранее>
	Users: 
	  	Chingiz Kariev
	  	Adonetuser
	
Пользователи:
	Имя: Chingiz Kariev
	Личный код: ifXdiQ2D2GaQvBhly
	Пароль:
	Группы:
		Admins

	Имя: Adonetuser
	Личный код: U6QTwfQ5qGu1Djmrbe4
	Пароль: 12345
	Группы:
		Только чтение

	Имя: admin
	Личный код: <Созданные ранее>
	Пароль: S0nxw3IDds5rO
	Группы:
		Users




Отчет мастера защиты				Дата работы г.

Желательно последовать совету мастера и сохранить эти сведения в надежном месте.

Итак, в результате всех проделанных действий в рабочем каталоге появились три файла - BDwithUsers.bak, BDwithUsers.mdb и BDWorkFile.mdw (рис. 3.24):

(рис 3.24) Файлы, полученные в результате работы мастера

В программном обеспечении к курсу вы найдете эти три файла (Code\Glava2\ BDwithUsers.bak, BDwithUsers.mdb и BDWorkFile.mdw).

Файл BDwithUsers.bak тоже лучше сохранить в надежном месте, поскольку он представляет собой незащищенную копию базы данных.

Запускаем файл BDWorkFile.mdw - появляется окно, в котором следует ввести имя пользователя "Adonetuser" и пароль "12345" (рис. 3.25):

(рис 3.25) Аутентификация пользователя "Adonetuser"

Открывается окно базы данных, в котором имеющиеся таблицы доступны только для чтения. Выходим из приложения и запускаем его снова. Введем на этот раз имя администратора базы - "Chingiz Kariev", без пароляКонечно, это нонсенс - аутентификация ограниченного пользователя с паролем, а администратора - без пароля. Имейте в виду, что на практике так быть не должно. Здесь я просто ввожу всего одного пользователя с паролем для предельной ясности изложения. (рис. 3.26).

(рис 3.26) Аутентификация пользователя "Chingiz Kariev"

На этот раз база данных открывается с полным доступом, более того, выбрав пункт главного меню "Сервис \ Защита \ Мастер_", можно редактировать уже существующий файл рабочей группы, добавляя например, новых пользователей (рис. 3.27):

(рис 3.27) Первый шаг мастера. Изменение файла BDWorkFile.mdw рабочей группы

При создании файла рабочей группы BDWorkFile.mdw мы определили его дальнейшее использование по умолчанию (см. рис. 3.17). Это означает, что вся дальнейшая работа с программой Microsoft Access на данном компьютере будет производиться от имени этого файла и определенных в нем пользователей. Без наличия соответствующих прав будет невозможно создать даже новую базу данныхЕсли вы окончательно запутались, забыли или неправильно ввели пароль, словом, Microsoft Access 2003 перестал работать на вашем компьютере, удалите пакет Microsoft Office. Запустите редактор реестра, найдите раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0 и удалите папку Access. Установите Microsoft Office заново.. Для возврата к файлу рабочей группы, принятому по умолчанию, проделываем следующие действия:

  • включаем режим отображения скрытых файлов и папок;
  • открываем базу данных BDwithUsers.mdb от имени администратора (здесь - от имени пользователя "Chingiz Kariev");
  • в главном меню программы переходим "Сервис \ Защита \ Администратор рабочих групп" (см. рис. 2.7);
  • появляется окно "Администратор рабочих групп", в котором отображается связь с текущим файлом BDWorkFile.mdw. Нажимаем кнопку "Связь" для смены рабочего файла (рис 3.28(рис 3.28) Окно "Администратор рабочих групп"
  • в появившемся окне "Файл рабочей группы" нажимаем кнопку "Обзор". Переходим в директорию C:\Documents and Settings\ Имя пользователя (здесь - Chingiz Kariev)\Application Data\ Microsoft\Access и выбираем файл System.mdw. Это файл рабочей группы, который программа использует с момента своей установки. Нажимаем кнопку "Открыть". В окне "Файл рабочей группы" нажимаем "OK". Появляется уведомление "Успешное присоединения файла рабочей группы" (рис 3.29(рис 3.29) Уведомление присоединения файла рабочей группы
  • нажимаем кнопку "OK" - теперь в окне "Администратор рабочих групп" отображается связь с файлом по умолчанию "System.mdw". Нажимаем "OK" для завершения (рис 3.30(рис 3.30) Связь с файлом System.mdw в окне "Администратор рабочих групп"
  • В результате проделанных операций мы вернулись к файлу рабочей группы, принятому по умолчанию. Теперь при создании новых баз данных снова будем работать от имени администратора "Admin". Однако мы не сможем открыть базу данных BDwithUsers.mdb, использующую другой файл рабочей группы (рис. 3.31):

    (рис 3.31) Попытка открыть базу данных BDwithUsers.mdb

    Для открытия базы данных нам снова нужно будет связаться со своеобразным электронным ключом - файлом BDWorkFile.mdw. Сделайте это самостоятельно.

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

    Изменим пароль администратора "Chingiz Kariev" базы BDwithUsers.mdb. Открываем от имени этого пользователя базу данных, в главном меню переходим "Сервис \ Защита \ Пользователи и группы_" (см. рис. 3.7). В появившемся окне "Пользователи и группы" из выпадающего списка "Имя" выбираем этого пользователя, переходим на вкладку "Изменение пароля". Оставляя пустым поле "Текущий пароль", вводим и подтверждаем пароль "a1s2d3f4g5h6j7k8l9z0" (рис. 3.32):

    (рис 3.32) Изменение пароля администратора базы данных

    Аналогично, открывая базу от имени пользователя "Adonetuser", можно изменить его пароль.

    Может показаться, что вся эта продуманная система разделения пользователей предоставляет надежную безопасность создаваемым приложениям. Но это не так - вся информация по-прежнему хранятся в незашифрованном виде в файле рабочей группы. Достаточно получить к этому файлу доступ - а для работы самой базы данных это необходимое условие, - чтобы получить все сведения о пользователях и их паролях. Утилита Access Password (http://www.thegrideon.com) позволяет считывать все данные (рис. 3.33):

    (рис 3.33) Вскрытие учетных записей пользователей MS Access

    С помощью утилиты просмотрим также содержимое файла System.mdw. Здесь мы видим всего одного пользователя "admin"с пустым паролем, обладающего правами администратора (рис. 3.34):

    (рис 3.34) Просмотра файла System.mdw

    Именно от этого пользователя по умолчанию мы начинаем работать с MS Access после установки пакета Microsoft Office.

    Займемся подключением к базе из приложений. Создайте новый Windows-проект и назовите его "VisualBDwithUsers". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Переходим на вкладку Data панели инструментов Toolbox, дважды щелкаем на объекте OleDbDataAdapter. В появившемся мастере настраиваем подключение к базе BDwithUsers.mdb, в поле "Пользователь" вводим "Adonetuser", в поле "Пароль" - значение "12345". Но при проверке подключения снова появляется сообщение об ошибке (рис. 3.35):

    (рис 3.35) Ошибка при проверке подключения к базе "BDwithUsers.mdb"

    В чем же дело? Мы ведь ввели все значения в специально предназначенные для этого поля! Интерфейс вкладки "Подключение" снова не предоставляет возможности ввода всех нужных сведений для подключения. Переходим на вкладку "Все", выделяем свойство "Jet OLEDB:System database" и нажимаем кнопку "Изменить значение" (можно также дважды щелкнуть на этом свойстве). В появившемся окне "Изменение значения свойства" указываем путь к файлу BDWorkFile.mdw вместе с его полным названием (включающим расширение файла) (рис. 3.36).

    (рис 3.36) Определение значение свойства "Jet OLEDB:System database"

    Переходим на вкладку "Подключение", проверяем связь с базой - на этот раз проверка будет успешной (рис. 3.37).

    (рис 3.37) Успешная проверка подключения к базе "BDwithUsers.mdb"

    Нажимаем кнопку "OK" для закрывания окна "Свойства связи с данными". Теперь появляется дополнительное окно, в котором следует повторно ввести пароль пользователя (рис. 3.38).

    (рис 3.38) Дополнительно окно подключения к базе данных

    В этом окне заметно "обрезанное" расположение подписей полей: это можно считать недоработкой VS 2003 - даже при разрешении экрана 1280х1024 форма выглядит так же. Дополнительно в выпадающем списке "Режим открытия" выбираем значение DB_MODE_READ, поскольку пользователь "Adonetuser" обладает правами только на чтение данных. Закрываем это окно, завершаем работу мастера, настраивая извлечение всех записей из таблицы "Туристы". В последнем шаге мастера оставляем включение пароля в строку connection string (см. рис. 3.14).

    На панели компонент формы выделяем объект DataAdapter, переходим в его окно Properties и нажимаем на ссылку Generate dataset. Оставляем название объекта DataSet, предлагаемое по умолчанию. В конструкторе формы заполняем объект DataSet, а также определяем источник данных для элемента DataGrid:

    public Form1()
    		{
    			InitializeComponent();
    			oleDbDataAdapter1.Fill(dataSet11);
    			dataGrid1.DataSource = dataSet11.Tables[0].DefaultView;
    		}

    Запускаем приложение. На форму снова выводятся данные из базы (см. рис. 3.15).

    В программном обеспечении к курсу вы найдете приложение VisualB DwithUsers (Code\Glava2\ VisualBDwithUsers).

    Сделаем точно такое же приложение без использования визуальных средств студии. Создайте новый Windows-проект, назовите его "ProgrammBDwithUsers". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

    using System.Data.OleDb;

    В классе формы создаем строки connectionString и commandText:

    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsers.mdb"
     ";Jet OLEDB:System database=""D:\Uchebnik\Code\Glava2
     \BDWorkFile.mdw"";User ID=Adonetuser;Password=12345;";
    
    string commandText = "SELECT * FROM Туристы";

    В конструкторе формы создаем все объекты ADO .NET:

    public Form1()
    	{
    		InitializeComponent();
    		OleDbConnection conn = new OleDbConnection();
    		conn.ConnectionString = connectionString;
    		OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
    		DataSet ds = new DataSet();
    		dataAdapter.Fill(ds);
    		dataGrid1.DataSource = ds.Tables[0].DefaultView;
    		conn.Close();
    	}

    В программном обеспечении к курсу вы найдете приложение ProgrammBDwithUsers (Code\Glava2\ ProgrammBDwithUsers).

    Подключение к базе данных Microsoft Access с паролем, защищенной на уровне пользователей. Вскрытие пароля и учетных записей

    База данных, защищенная на уровне пользователей, может также содержать пароль на открытие. Скопируйте файл базы BDwithUsers.mdb и назовите его "BDwithUsersP.mdb". Открываем новый файл в монопольном режиме от имени пользователя "Chingiz Kariev". В главном меню программы переходим "Сервис \ Защита \ Задать пароль базы данных". В появившемся окне вводим пароль "98765" и подтверждаем его. Теперь при повторном открытии от имени любого пользователя необходимо вначале проходить аутентификацию, а затем вводить пароль базы данных (рис. 3.39):

    (рис 3.39) Аутентификация и ввод пароля на открытие базы

    Базы данных BDwithUsers.mdb и BDwithUsersP.mdb используют один файл рабочей группы BDWorkFile.mdw. Просмотрев его содержимое при помощи программы Access Password, мы обнаружим, что его содержимое не изменилось (см. рис. 3.33). Этого и следовало ожидать - в файле рабочей группы хранятся сведения об учетных записях пользователей и группах, но не пароли самих баз данных. Для просмотра пароля базы открываем файл BDwithUsersP.mdb (рис. 3.40):

    (рис 3.40) Просмотр файла BDwithUsersP.mdb

    Создайте новое Windows-приложение и назовите его "Programm BDwithUsersP". На этот раз создадим подключение программным образом. Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

    using System.Data.OleDb;

    В классе формы создаем строки connectionString и commandText:

    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsersP.mdb"
     ";Jet OLEDB:System database=""D:\Uchebnik\Code\Glava2
     \BDWorkFile.mdw"";User ID=Adonetuser;Password=12345;
     Jet OLEDB:Database Password=98765;";
    string commandText = "SELECT * FROM Туристы";

    Здесь мы добавили значения пароля "98765" в параметре "Jet OLEDB:Database Password". Подключение не будет зависеть от порядка передаваемых параметров, строка connectionString может выглядеть и так:

    string connectionString = @"Jet OLEDB:Database 
     Password=98765;Provider=""Microsoft.Jet.OLEDB.4.0"";
     Data Source=""D:\Uchebnik\Code\Glava2
     \BDwithUsersP.mdb"";Password=12345;Jet OLEDB:System 
     database=""D:\Uchebnik\Code\Glava2\BDWorkFile.mdw"
     ";User ID=Adonetuser;";

    Тем не менее следует придерживаться последовательного расположения параметров для более удобного чтения кода. В конструкторе формы создаем все объекты ADO .NET:

    public Form1()
    {
    	InitializeComponent();
    	OleDbConnection conn = new OleDbConnection();
    	conn.ConnectionString = connectionString;
    	OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
    	DataSet ds = new DataSet();
    	dataAdapter.Fill(ds);
    	dataGrid1.DataSource = ds.Tables[0].DefaultView;
    	conn.Close();
    }

    В программном обеспечении к курсу вы найдете приложение Programm BDwithUsersP (Code\Glava2\ ProgrammBDwithUsersP).

    Страницы:
    Внимание! Для работы с лекциями 3, 4 необходимы учебные файлы, которые Вы можете загрузить здесь.

    Подключение к базе данных Microsoft Access

    Связывание элементов управления с данными

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

    Создайте новое Windows-приложение. Назовите его "DataTextBox". Переходим на вкладку Data панели инструментов Toolbox и перетаскиваем oleDbDataAdapter. В запустившемся мастере устанавливаем подключение к файлу Microsoft Access "BDTur_firm.mdb" и выбираем все поля таблицы "Туристы". В свойствах oleDbDataAdapter1 на информационной панели нажимаем "Generate Dataset". Называем его "dsTourists". Переходим в код формы, подключаем пространство имен:

    using System.Data.OleDb;

    В конструкторе формы после InitializeComponent вызываем метод Fill объекта oleDbDataAdapter:

    oleDbDataAdapter1.Fill(dsTourists1);

    Переключаемся в режим дизайна. Располагаем на форме Label и TextBox. В свойстве Text элемента label вводим "Фамилия", в этом же свойстве элемента textBox оставляем пустую строку. Свойству Size формы устанавливаем значение 300; 100.

    Щелкаем на знак (+) свойства DataBindings элемента управления textBox. В значении поля Text этой группы снова щелкаем на знак (+) около элемента dsProvider и выбираем поле "Фамилия" (рис. 3.1):

    (рис 3.1) Связывание элемента textBox с данными

    Запускаем приложение. Теперь в текстовое поле выводится первое значение столбца "Фамилия" (рис. 3.2):

    (рис 3.2) Готовая форма

    В программном обеспечении к курсу вы найдете приложение DataTextBox (Code\Glava2\ DataTextBox).

    Теперь рассмотрим связывание элементов управления с данными, осуществляемое программным образом. Создайте новое Windows-приложение. Назовите его "DataBindings". На создавшейся форме располагаем по четыре элемента TextBox и Label (рис. 3.3):

    (рис 3.3) Расположение элементов на форме

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

    Код туриста - txtID
    Фамилия - txtLastName
    Имя - txtFirstName
    Отчество - txtMiddleName.

    Далее подключаем пространство имен:

    using System.Data.OleDb;

    Задаем строки подключения:

    string сommandText = "SELECT Имя, [Код туриста],
     Отчество, Фамилия FROM Туристы"; 
    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava1\BDTur_firm.mdb"
     ";User ID=Admin;Jet OLEDB:Encrypt Database=False";

    Устанавливаем соединение и определяем все необходимые объекты в конструкторе формы:

    OleDbConnection conn = new OleDbConnection(connectionString);
    conn.Open();
    OleDbCommand myCommand = new OleDbCommand();
    myCommand.Connection = conn;
    myCommand.CommandText = commandText;
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
    dataAdapter.SelectCommand = myCommand;
    DataSet ds = new DataSet();
    dataAdapter.TableMappings.Add("Table", "Туристы");
    dataAdapter.Fill(ds);

    Для связывания свойства Text текстового поля txtID с полем "Код туриста" таблицы "Туристы" используем код

    txtID.DataBindings.Add("Text", ds, "Туристы.Код туриста");

    Аналогично для других текстовых полей:

    txtFirstName.DataBindings.Add("Text", ds, "Туристы.Имя");
    txtLastName.DataBindings.Add("Text", ds, "Туристы.Фамилия");
    txtMiddleName.DataBindings.Add("Text", ds, "Туристы.Отчество");

    Обратите внимание на названия соответствующих столбцов. На практике вы никогда не встретите названий столбцов таблицы базы данных, содержащих пробелы между слов, и к тому же на кириллице - это нонсенс. В нашем учебном проекте тем не менее все работает. Почему? Дело в том, что среда Visual Studio .NET поддерживает кодировку Unicode, поэтому теоретически названия переменных и объектов можно давать на русском языке. Вы можете убедиться в этом, переименовав, скажем переменную "connectionString" в "строкаПодключения" а "ds" в "ДатаСет" и запустить приложение - все будет работать. Но если мы будем создавать коммерческое приложение, которое должно будет работать в самых разных условиях, подобный код сам по себе может стать источником многочисленных ошибок. Поэтому давать названия на кириллице не следует. Для ясности изложения, однако, оставим названия столбцов как есть.

    Закрываем соединение:

    conn.Close();

    Запускаем приложение. В текстовых полях выводится соответствующая информация.

    Перемещение по записям. Объект CurrencyManager

    Продолжим работу над проектом DataBindings. При выводе данных в виде отдельных записей необходимо реализовать возможность перемещения по записям. Это можно сделать с помощью экземпляра класса CurrencyManager. Располагаем на форме четыре кнопки и надпись в ряд следующим образом (рис. 3.4):

    (рис 3.4) Расположение кнопок

    Устанавливаем следующие свойства элементов управления:

    Элемент Name Text
    Кнопка btnFirst <<
    Кнопка btnPrevious <
    Кнопка btnNext >
    Кнопка btnLast >>
    Надпись lblRecordsPosition

    Объявляем экземпляр cmRecords класса CurrencyManager в классе формы:

    CurrencyManager cmRecords;

    В конструкторе формы Form1 связываем созданный объект cmRecords с таблицей "Туристы" объекта ds:

    cmRecords = (CurrencyManager)BindingContext[ds, "Туристы"];

    Создаем обработчиков для событий ItemChanged и PositionChanged объекта cmRecords:

    cmRecords.ItemChanged+=new ItemChangedEventHandler(cmRecords_ItemChanged);
    cmRecords.PositionChanged+=new EventHandler(cmRecords_PositionChanged);

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

    DisplayRecordsPosition ();

    Создаем этот метод:

    private void DisplayRecordsPosition()
    {
     lblRecordsPosition.Text = "Запись " + (cmRecords.Position + 1)
      + " из " + cmRecords.Count;
    }

    Добавляем методы, вызывающие метод DisplayRecordsPosition() в случае наступления событий ItemChanged и PositionChanged:

    private void cmRecords_ItemChanged( object sender, ItemChangedEventArgs e)
    		{
    			DisplayRecordsPosition();
    		}
    private void cmRecords_PositionChanged( object sender, System.EventArgs e)
    		{
    			DisplayRecordsPosition();
    		}

    Добавляем обработчиков для нажатий навигационных кнопок:

    private void btnFirst_Click(object sender, System.EventArgs e)
    		{
    			cmRecords.Position = 0;
    		}
    
    private void btnPrevious_Click(object sender, System.EventArgs e)
    		{
    			cmRecords.Position--;
    		}
    
    private void btnNext_Click(object sender, System.EventArgs e)
    		{
    			cmRecords.Position++;
    		}
    
    private void btnLast_Click(object sender, System.EventArgs e)
    		{
    			cmRecords.Position = cmRecords.Count - 1;
    		}

    Запускаем приложение. Теперь можно перемещаться по записям (рис. 3.5):

    (рис 3.5) Форма с навигационными кнопками

    В программном обеспечении к курсу вы найдете приложение DataBindings (Code\Glava2\DataBindings).

    Подключение к базе данных Microsoft Access, защищенной паролем. Вскрытие пароля

    Файл базы данных Microsoft Access, подобно другим документам Office, можно защитить с помощью пароля на открытие. Скопируйте файл BDTur_firm.mdb, с которым мы работали в первой главе, назовите его "BD_withPassword.mdb". Для установки пароля нам понадобится открыть базу в так называемом монопольном, однопользовательском режиме. Дело в том, что возможность установки пароля при одновременной работе нескольких пользователейMicrosoft Office Access 2003 поддерживает одновременную работу 255 пользователей. приводила бы к ошибкам, поэтому MS Access не предоставляет ее. Запускаем программу, в главном меню переходим "Файл \ Открыть", переходим в нужную директорию, выделяем файл, из выпадающего списка значений кнопки "Открыть" выбираем "Монопольно" (рис. 3.6):

    (рис 3.6) Монопольное открытие файла базы данных

    Появляется окно базы данных. В главном меню переходим "Сервис \ Защита \ Задать пароль базы данных", в окне "Задание пароля базы данных" вводим пароль "12345" и подтверждаем его (рис. 3.7).

    (рис 3.7) Задание пароля базы данных

    Теперь всякий раз при открытии этого файла на любом компьютере нужно будет вводить указанный пароль (рис. 3.8).

    (рис 3.8) Открывание базы данных с паролем

    Для изменения пароля нам потребуется удалить существующий и затем задать новый. Снова открываем базу в монопольном режиме, в главном меню переходим "Сервис \ Защита \ Удалить пароль базы данных". В появившемся окне вводим текущий пароль, после нажатия кнопки "OK" он будет удален. Для ввода нового значения опять переходим к пункту меню "Задать пароль базы данных", на этот раз введем более сложный пароль "q1w2e3r4t5y6u7i8o9p0".

    Защита файла с помощью пароля - крайне ненадежный способ, его нельзя применять в реальных приложениях. Пароль хранится в открытом виде, и его очень легко вскрыть. В Интернете множество утилит, предназначенных для этого, например, Access Password Recovery Genie (http://www.lenosoft.com). После запуска этой программы выбираем файл MS Access, пароль к которому нужно подобрать, - и пароль моментально появляется в главном окне (рис. 3.9).

    (рис 3.9) Вскрытие пароля файла MS Access

    Далее нам снова понадобится вводить пароль - чтобы не тратить время, установите снова его значение равным "12345". Займемся теперь подключением к файлу базы данных из приложений. Конечно, вы теперь будете сомневаться, применять ли вообще задание пароля как средство безопасности, но нам в любом случае нужно научиться подключаться даже к такой, "ненадежной" базе. Создайте новый Windows-проект и назовите его "VisualBD_withPassword". Из окна Toolbox перетаскиваем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Переходим на вкладку Data дважды щелкаем на объекте OleDbDataAdapter. В появившемся мастере настраиваем подключение к файлу BD_withPassword.mdb. Теперь в окне "Свойства связи с данными" при проверке соединения появляется сообщение об ошибке (рис. 3.10):

    (рис 3.10) Ошибка проверки подключения, возникающая при отсутствии пароля

    Исходя из текста ошибки, возникает естественное желание снять галочку "Пустой пароль" и в поле пароля ввести "12345". Но и на этот раз возникает ошибкаУбедитесь также в том, что ваш файл базы данных не открыт в самой программе Microsoft Access. (рис. 3.11):

    (рис 3.11) Ошибка проверки подключения, возникающая при неправильном указании пароля

    Дело в том, что интерфейс вкладки "Подключение" предназначен для ввода параметров учетной записи при защите на уровне пользователей. Далее мы рассмотрим ее. Здесь же снова устанавливаем галочку "Пустой пароль" и переходим на вкладку "Все". Дважды щелкаем на свойстве Jet OLEDB:Database Password (или, выделив его, нажимаем на кнопку "Изменить значение"), в появившемся окне "Изменение значения свойства" вводим пароль "12345" (рис. 3.12).

    (рис 3.12) Ввод пароля для подключения к базе данных

    Переходим на вкладку "Подключение" - наконец нам удалось получить доступ к базе (рис. 3.13).

    (рис 3.13) Успешная проверка подключения

    Нажимаем кнопку "OK" для закрытия окна "Свойства связи с данными", в следующих шагах мастера "Data Adapter Configuration Wizard" настраиваем извлечение всех записей из таблицы "Туристы". В последнем шаге мастера - включение пароля в строку connection string - выбираем кнопку "Include password"; мы будем изучать строку, сгенерированную мастером (рис. 3.14):

    (рис 3.14) Последний шаг мастера - включение пароля в строку connection string

    На панели компонент формы выделяем объект DataAdapter, переходим в его окно Properties и нажимаем на ссылку Generate dataset. Оставляем название объекта DataSet, предлагаемое по умолчанию. В конструкторе формы заполняем объект DataSet, а также определяем источник данных для элемента DataGrid:

    public Form1()
    		{
    			InitializeComponent();
    			oleDbDataAdapter1.Fill(dataSet11);
    			dataGrid1.DataSource = dataSet11.Tables[0].DefaultView;
    		}

    Здесь мы указываем индекс (равный нулю) единственной таблицы, находящейся в объекте DataSet.

    Запускаем приложение. На форму выводятся данные из базы (рис. 3.15):

    (рис 3.15) Готовое приложение VisualBD_withPassword

    В программном обеспечении к курсу вы найдете приложение VisualBD_ withPassword и файл базы данных MS Access "BD_withPassword.mdb" (Code\Glava2\VisualBD_withPassword и BD_withPassword.mdb).

    Сделаем точно такое же приложение без использования визуальных средств студии. Создайте новый Windows-проект, назовите его "ProgrammBD_withPassword". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

    using System.Data.OleDb;

    В классе формы создаем строки connectionString и commandText:

    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava2\BD_withPassword.mdb"
     ";User ID=Admin;Jet OLEDB:Database Password=12345;";
    string commandText = "SELECT * FROM Туристы";

    Мы включили минимум параметров в строку подключения, среди которых указывается пароль базы:

    Jet OLEDB:Database Password=12345;

    В конструкторе формы создаем все объекты ADO .NET:

    public Form1()
    	{
    		InitializeComponent();
    		OleDbConnection conn = new OleDbConnection();
    		conn.ConnectionString = connectionString;
    		OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
    		DataSet ds = new DataSet();
    		dataAdapter.Fill(ds);
    		dataGrid1.DataSource = ds.Tables[0].DefaultView;
    		conn.Close();
    	}

    В программном обеспечении к курсу вы найдете приложение ProgrammBD_ withPassword (Code\Glava2\ ProgrammBD_withPassword).

    Подключение к базе данных Microsoft Access, защищенной на уровне пользователей. Вскрытие учетных записей

    Microsoft Access предоставляет средства распределенного доступа к базе данных. С одним файлом могут одновременно работать большое количество пользователей, обладающих разными правами: одни могут только просматривать таблицы, другие - только вносить новые данные, и лишь администраторы базы обладают полным доступом. Когда мы устанавливаем пакет Microsoft Office на локальный компьютер и, ни о чем не задумываясь, начинаем создавать свою базу в программе Access, мы по умолчанию выступаем в роли администратора. Поставим теперь задачу: разделить доступ для двух пользователей - один сможет только просматривать данные (читать), другой по-прежнему будет обладать полным доступом. Скопируйте файл BDTur_firm.mdb и назовите его "BDwithUsers.mdb". Открываем базу, в главном меню программы переходим "Сервис \ Защита \ Мастер" (см. рис. 2.7). Появляется мастер защиты, в первом шаге которого доступен единственный переключатель "Создать файл рабочей группы" ( рис. 3.16):

    (рис 3.16) Первый шаг мастера защиты

    Файл рабочей группы представляет собой своеобразный электронный ключ, в котором будут храниться созданные настройки. Он имеет расширение *.mdw. В следующем шаге мастера нажимаем кнопку "Обзор" - по умолчанию мы оказываемся в той же директории, где расположен исходный файл базы данных BDwithUsers.mdb, вводим название создаваемого файла BDWorkFile.mdwВ этом шаге мастер предлагает название "Security.mdw" файла рабочей группы. Я предлагаю изменить это название - чтобы в дальнейшем его было легко отличить и не путать с файлами по умолчанию.. Нажимаем кнопку "Выбрать", возвращаясь в окно мастера. Устанавливаем переключатель на значение "Использовать файл рабочей группы по умолчанию". На другие параметры - "Код рабочей группы", "Ваше имя", "Организация" - можно не обращать внимания (рис. 3.17). Нажимаем кнопку "Далее".

    (рис 3.17) Определение файла рабочей группы BDWorkFile.mdw

    Теперь предстоит определить, какие объекты базы данных защищены. Оставляем все таблицы и нажимаем кнопку "Далее" (рис. 3.18).

    (рис 3.18) Определение объектов базы данных, которые будут защищены

    Мы добрались до самих рабочих групп. Программа Microsoft Access предлагает несколько рабочих групп, в каждой из которых может быть большое число пользователей. К примеру, пять пользователей могут обладать полными правами, десять - быть разработчиками проекта и еще пять - обладать правами на обновление данных. Код группы также можно не запоминать. Мы выбираем группу "Только чтение", отмечая ее галочкойОбратите внимание, что интерфейс программы предоставляет возможность одновременного выбора нескольких (или всех групп) - нужно просто отметить соответствующие чекбоксы., нажимаем кнопку "Далее" (рис. 3.19).

    (рис 3.19) Выбор рабочей группы

    Теперь требуется определить права группы Users. Это группа в любом случае будет входить в файл BDWorkFile.mdw; по умолчанию пользователи, входящие в нее, могут работать с базой данных без всякого пароля. Предоставление каких-либо прав этой группе означает предоставление этих же прав любому пользователю. Поэтому из соображений безопасности Microsoft Access предлагает вариант по умолчанию. Изменение этого варианта означает встраивание "черного" входа в файл рабочей группы. Мы оставляем предложенное значение и нажимаем кнопку "Далее" (рис. 3.20):

    (рис 3.20) Определение разрешений группы Users

    В следующем шаге мастера следует определить пользователей и пароли. Именно эти сведения для каждого пользователя будут постоянно использоваться в работе с приложением, поэтому на них следует обратить внимание. В поле "Пользователь:" вводим "Adonetuser", задаем этому пользователю пароль "12345", нажимаем кнопку "Добавить пользователя в список". Поля "Пользователь" и "Пароль" очищаются, а в списке, расположенном в левой части формы, появляется новая запись. Нажимаем кнопку "Далее" (рис. 3.21).

    (рис 3.21) Добавление пользователя "Adonetuser"

    Итак, теперь у нас уже есть рабочая группа - "Только чтение", и теперь появился пользователь "Adonetuser". Из выпадающего списка "Группа или пользователь" следует выбрать "Adonetuser" и отметить галочкой группу "Только чтение" (рис. 3.22, А). При выборе второго пользователя из выпадающего списка - здесьКогда я устанавливал операционную систему на компьютере, я ввел свои фамилию и имя в качестве регистрационных данных. Далее, при установке пакета Microsoft Office, эти же сведения были предложены по умолчанию. Если вы хотите изменить эти сведения, лучший способ сделать это - переустановить пакет Microsoft Office. Для изменения регистрационных данных, введенных при установке системы, измените параметры реестра RegisteredOwner и RegisteredOrganization в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Далее, я везде буду писать "Chingiz Kariev", полагая, что вы выполняете действия, подставляя свое значение фамилии и имени. "Chingiz Kariev", - можно заметить, что он входит в группу Admins (рис. 3.22, Б). Это очень важный момент: должен быть хотя бы один пользователь-администратор, входящий в эту группу, в противном случае после завершения работы мастера мы не сможем добавлять новых пользователей и изменять права существующих!

    (рис 3.22) Распределение пользователей в рабочие группы. А - включение пользователя "Adonetuser" в группу "Только чтение", Б - вхождение пользователя "Chingiz Kariev" в группу "Admins" по умолчанию

    В последнем шаге мастера создается резервная копия базы данных. Она располагается в той же самой директории, где и основная (рис. 3.23). Несмотря на свое расширение - *.bak (backup), это, по сути, обычный файл базы данных Microsoft Access.

    (рис 3.23) Создание резервной копии базы данных

    При нажатии на кнопку "Готово" появляется отчет, создаваемый мастером защиты. Он включает в себя перечень всех сведений, которые в дальнейшем могут понадобиться для восстановления доступа к базе:

    Отчет мастера защиты
    Данный отчет содержит все сведения, необходимые для воссоздания 
    файла рабочей группы и восстановления доступа к защищенной базе 
    данных в случае повреждения. 
    Напечатайте или экспортируйте этот отчет и сохраните его в надежном месте.
    
    Незащищенная база данных:
    	D:\Uchebnik\Code\Glava2\BDwithUsers.bak
    Защищенная база данных:
    	D:\Uchebnik\Code\Glava2\BDwithUsers.mdb
    Файл рабочей группы:
    	D:\Uchebnik\Code\Glava2\BDWorkFile.mdw
    Пользователь:
    	Microsoft Access
    Организация:
    
    Код рабочей группы:
    	mx4qX5Gy6OGUgwmOZpt
    
    Защищенные объекты:
    	Таблицы:
    		Информация о туристах
    		Оплата
    		Путевки
    		Сезоны
    		Туристы
    		Туры
    		<Новые таблицы и запросы>
    	Запросы:
    		<Новые таблицы и запросы>
    	Формы:
    		<Новые формы>
    	Отчеты:
    		<Новые отчеты>
    	Макросы:
    		<Новые макросы>
    	База данных:
    		Пароль VBE не установлен
    Группы:
    	Имя: Только чтение
    	Код группы: FecIdp7S4zQTMaV5qAp
    	Users: 
    	  	Adonetuser
    	
    	Имя: Admins
    	Код группы: <Созданные ранее>
    	Users: 
    	  	Chingiz Kariev
    	
    	Имя: Users
    	Код группы: <Созданные ранее>
    	Users: 
    	  	Chingiz Kariev
    	  	Adonetuser
    	
    Пользователи:
    	Имя: Chingiz Kariev
    	Личный код: ifXdiQ2D2GaQvBhly
    	Пароль:
    	Группы:
    		Admins
    
    	Имя: Adonetuser
    	Личный код: U6QTwfQ5qGu1Djmrbe4
    	Пароль: 12345
    	Группы:
    		Только чтение
    
    	Имя: admin
    	Личный код: <Созданные ранее>
    	Пароль: S0nxw3IDds5rO
    	Группы:
    		Users
    
    
    
    
    Отчет мастера защиты				Дата работы г.

    Желательно последовать совету мастера и сохранить эти сведения в надежном месте.

    Итак, в результате всех проделанных действий в рабочем каталоге появились три файла - BDwithUsers.bak, BDwithUsers.mdb и BDWorkFile.mdw (рис. 3.24):

    (рис 3.24) Файлы, полученные в результате работы мастера

    В программном обеспечении к курсу вы найдете эти три файла (Code\Glava2\ BDwithUsers.bak, BDwithUsers.mdb и BDWorkFile.mdw).

    Файл BDwithUsers.bak тоже лучше сохранить в надежном месте, поскольку он представляет собой незащищенную копию базы данных.

    Запускаем файл BDWorkFile.mdw - появляется окно, в котором следует ввести имя пользователя "Adonetuser" и пароль "12345" (рис. 3.25):

    (рис 3.25) Аутентификация пользователя "Adonetuser"

    Открывается окно базы данных, в котором имеющиеся таблицы доступны только для чтения. Выходим из приложения и запускаем его снова. Введем на этот раз имя администратора базы - "Chingiz Kariev", без пароляКонечно, это нонсенс - аутентификация ограниченного пользователя с паролем, а администратора - без пароля. Имейте в виду, что на практике так быть не должно. Здесь я просто ввожу всего одного пользователя с паролем для предельной ясности изложения. (рис. 3.26).

    (рис 3.26) Аутентификация пользователя "Chingiz Kariev"

    На этот раз база данных открывается с полным доступом, более того, выбрав пункт главного меню "Сервис \ Защита \ Мастер_", можно редактировать уже существующий файл рабочей группы, добавляя например, новых пользователей (рис. 3.27):

    (рис 3.27) Первый шаг мастера. Изменение файла BDWorkFile.mdw рабочей группы

    При создании файла рабочей группы BDWorkFile.mdw мы определили его дальнейшее использование по умолчанию (см. рис. 3.17). Это означает, что вся дальнейшая работа с программой Microsoft Access на данном компьютере будет производиться от имени этого файла и определенных в нем пользователей. Без наличия соответствующих прав будет невозможно создать даже новую базу данныхЕсли вы окончательно запутались, забыли или неправильно ввели пароль, словом, Microsoft Access 2003 перестал работать на вашем компьютере, удалите пакет Microsoft Office. Запустите редактор реестра, найдите раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0 и удалите папку Access. Установите Microsoft Office заново.. Для возврата к файлу рабочей группы, принятому по умолчанию, проделываем следующие действия:

  • включаем режим отображения скрытых файлов и папок;
  • открываем базу данных BDwithUsers.mdb от имени администратора (здесь - от имени пользователя "Chingiz Kariev");
  • в главном меню программы переходим "Сервис \ Защита \ Администратор рабочих групп" (см. рис. 2.7);
  • появляется окно "Администратор рабочих групп", в котором отображается связь с текущим файлом BDWorkFile.mdw. Нажимаем кнопку "Связь" для смены рабочего файла (рис 3.28(рис 3.28) Окно "Администратор рабочих групп"
  • в появившемся окне "Файл рабочей группы" нажимаем кнопку "Обзор". Переходим в директорию C:\Documents and Settings\ Имя пользователя (здесь - Chingiz Kariev)\Application Data\ Microsoft\Access и выбираем файл System.mdw. Это файл рабочей группы, который программа использует с момента своей установки. Нажимаем кнопку "Открыть". В окне "Файл рабочей группы" нажимаем "OK". Появляется уведомление "Успешное присоединения файла рабочей группы" (рис 3.29(рис 3.29) Уведомление присоединения файла рабочей группы
  • нажимаем кнопку "OK" - теперь в окне "Администратор рабочих групп" отображается связь с файлом по умолчанию "System.mdw". Нажимаем "OK" для завершения (рис 3.30(рис 3.30) Связь с файлом System.mdw в окне "Администратор рабочих групп"
  • В результате проделанных операций мы вернулись к файлу рабочей группы, принятому по умолчанию. Теперь при создании новых баз данных снова будем работать от имени администратора "Admin". Однако мы не сможем открыть базу данных BDwithUsers.mdb, использующую другой файл рабочей группы (рис. 3.31):

    (рис 3.31) Попытка открыть базу данных BDwithUsers.mdb

    Для открытия базы данных нам снова нужно будет связаться со своеобразным электронным ключом - файлом BDWorkFile.mdw. Сделайте это самостоятельно.

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

    Изменим пароль администратора "Chingiz Kariev" базы BDwithUsers.mdb. Открываем от имени этого пользователя базу данных, в главном меню переходим "Сервис \ Защита \ Пользователи и группы_" (см. рис. 3.7). В появившемся окне "Пользователи и группы" из выпадающего списка "Имя" выбираем этого пользователя, переходим на вкладку "Изменение пароля". Оставляя пустым поле "Текущий пароль", вводим и подтверждаем пароль "a1s2d3f4g5h6j7k8l9z0" (рис. 3.32):

    (рис 3.32) Изменение пароля администратора базы данных

    Аналогично, открывая базу от имени пользователя "Adonetuser", можно изменить его пароль.

    Может показаться, что вся эта продуманная система разделения пользователей предоставляет надежную безопасность создаваемым приложениям. Но это не так - вся информация по-прежнему хранятся в незашифрованном виде в файле рабочей группы. Достаточно получить к этому файлу доступ - а для работы самой базы данных это необходимое условие, - чтобы получить все сведения о пользователях и их паролях. Утилита Access Password (http://www.thegrideon.com) позволяет считывать все данные (рис. 3.33):

    (рис 3.33) Вскрытие учетных записей пользователей MS Access

    С помощью утилиты просмотрим также содержимое файла System.mdw. Здесь мы видим всего одного пользователя "admin"с пустым паролем, обладающего правами администратора (рис. 3.34):

    (рис 3.34) Просмотра файла System.mdw

    Именно от этого пользователя по умолчанию мы начинаем работать с MS Access после установки пакета Microsoft Office.

    Займемся подключением к базе из приложений. Создайте новый Windows-проект и назовите его "VisualBDwithUsers". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Переходим на вкладку Data панели инструментов Toolbox, дважды щелкаем на объекте OleDbDataAdapter. В появившемся мастере настраиваем подключение к базе BDwithUsers.mdb, в поле "Пользователь" вводим "Adonetuser", в поле "Пароль" - значение "12345". Но при проверке подключения снова появляется сообщение об ошибке (рис. 3.35):

    (рис 3.35) Ошибка при проверке подключения к базе "BDwithUsers.mdb"

    В чем же дело? Мы ведь ввели все значения в специально предназначенные для этого поля! Интерфейс вкладки "Подключение" снова не предоставляет возможности ввода всех нужных сведений для подключения. Переходим на вкладку "Все", выделяем свойство "Jet OLEDB:System database" и нажимаем кнопку "Изменить значение" (можно также дважды щелкнуть на этом свойстве). В появившемся окне "Изменение значения свойства" указываем путь к файлу BDWorkFile.mdw вместе с его полным названием (включающим расширение файла) (рис. 3.36).

    (рис 3.36) Определение значение свойства "Jet OLEDB:System database"

    Переходим на вкладку "Подключение", проверяем связь с базой - на этот раз проверка будет успешной (рис. 3.37).

    (рис 3.37) Успешная проверка подключения к базе "BDwithUsers.mdb"

    Нажимаем кнопку "OK" для закрывания окна "Свойства связи с данными". Теперь появляется дополнительное окно, в котором следует повторно ввести пароль пользователя (рис. 3.38).

    (рис 3.38) Дополнительно окно подключения к базе данных

    В этом окне заметно "обрезанное" расположение подписей полей: это можно считать недоработкой VS 2003 - даже при разрешении экрана 1280х1024 форма выглядит так же. Дополнительно в выпадающем списке "Режим открытия" выбираем значение DB_MODE_READ, поскольку пользователь "Adonetuser" обладает правами только на чтение данных. Закрываем это окно, завершаем работу мастера, настраивая извлечение всех записей из таблицы "Туристы". В последнем шаге мастера оставляем включение пароля в строку connection string (см. рис. 3.14).

    На панели компонент формы выделяем объект DataAdapter, переходим в его окно Properties и нажимаем на ссылку Generate dataset. Оставляем название объекта DataSet, предлагаемое по умолчанию. В конструкторе формы заполняем объект DataSet, а также определяем источник данных для элемента DataGrid:

    public Form1()
    		{
    			InitializeComponent();
    			oleDbDataAdapter1.Fill(dataSet11);
    			dataGrid1.DataSource = dataSet11.Tables[0].DefaultView;
    		}

    Запускаем приложение. На форму снова выводятся данные из базы (см. рис. 3.15).

    В программном обеспечении к курсу вы найдете приложение VisualB DwithUsers (Code\Glava2\ VisualBDwithUsers).

    Сделаем точно такое же приложение без использования визуальных средств студии. Создайте новый Windows-проект, назовите его "ProgrammBDwithUsers". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

    using System.Data.OleDb;

    В классе формы создаем строки connectionString и commandText:

    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsers.mdb"
     ";Jet OLEDB:System database=""D:\Uchebnik\Code\Glava2
     \BDWorkFile.mdw"";User ID=Adonetuser;Password=12345;";
    
    string commandText = "SELECT * FROM Туристы";

    В конструкторе формы создаем все объекты ADO .NET:

    public Form1()
    	{
    		InitializeComponent();
    		OleDbConnection conn = new OleDbConnection();
    		conn.ConnectionString = connectionString;
    		OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
    		DataSet ds = new DataSet();
    		dataAdapter.Fill(ds);
    		dataGrid1.DataSource = ds.Tables[0].DefaultView;
    		conn.Close();
    	}

    В программном обеспечении к курсу вы найдете приложение ProgrammBDwithUsers (Code\Glava2\ ProgrammBDwithUsers).

    Подключение к базе данных Microsoft Access с паролем, защищенной на уровне пользователей. Вскрытие пароля и учетных записей

    База данных, защищенная на уровне пользователей, может также содержать пароль на открытие. Скопируйте файл базы BDwithUsers.mdb и назовите его "BDwithUsersP.mdb". Открываем новый файл в монопольном режиме от имени пользователя "Chingiz Kariev". В главном меню программы переходим "Сервис \ Защита \ Задать пароль базы данных". В появившемся окне вводим пароль "98765" и подтверждаем его. Теперь при повторном открытии от имени любого пользователя необходимо вначале проходить аутентификацию, а затем вводить пароль базы данных (рис. 3.39):

    (рис 3.39) Аутентификация и ввод пароля на открытие базы

    Базы данных BDwithUsers.mdb и BDwithUsersP.mdb используют один файл рабочей группы BDWorkFile.mdw. Просмотрев его содержимое при помощи программы Access Password, мы обнаружим, что его содержимое не изменилось (см. рис. 3.33). Этого и следовало ожидать - в файле рабочей группы хранятся сведения об учетных записях пользователей и группах, но не пароли самих баз данных. Для просмотра пароля базы открываем файл BDwithUsersP.mdb (рис. 3.40):

    (рис 3.40) Просмотр файла BDwithUsersP.mdb

    Создайте новое Windows-приложение и назовите его "Programm BDwithUsersP". На этот раз создадим подключение программным образом. Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой:

    using System.Data.OleDb;

    В классе формы создаем строки connectionString и commandText:

    string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
     ";Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsersP.mdb"
     ";Jet OLEDB:System database=""D:\Uchebnik\Code\Glava2
     \BDWorkFile.mdw"";User ID=Adonetuser;Password=12345;
     Jet OLEDB:Database Password=98765;";
    string commandText = "SELECT * FROM Туристы";

    Здесь мы добавили значения пароля "98765" в параметре "Jet OLEDB:Database Password". Подключение не будет зависеть от порядка передаваемых параметров, строка connectionString может выглядеть и так:

    string connectionString = @"Jet OLEDB:Database 
     Password=98765;Provider=""Microsoft.Jet.OLEDB.4.0"";
     Data Source=""D:\Uchebnik\Code\Glava2
     \BDwithUsersP.mdb"";Password=12345;Jet OLEDB:System 
     database=""D:\Uchebnik\Code\Glava2\BDWorkFile.mdw"
     ";User ID=Adonetuser;";

    Тем не менее следует придерживаться последовательного расположения параметров для более удобного чтения кода. В конструкторе формы создаем все объекты ADO .NET:

    public Form1()
    {
    	InitializeComponent();
    	OleDbConnection conn = new OleDbConnection();
    	conn.ConnectionString = connectionString;
    	OleDbDataAdapter dataAdapter = new OleDbDataAdapter(commandText, conn);
    	DataSet ds = new DataSet();
    	dataAdapter.Fill(ds);
    	dataGrid1.DataSource = ds.Tables[0].DefaultView;
    	conn.Close();
    }

    В программном обеспечении к курсу вы найдете приложение Programm BDwithUsersP (Code\Glava2\ ProgrammBDwithUsersP).

    Вернуться к учебному плану