Шаг 92.
Microsoft Visual C++ 2010. Начала. Базы данных. Базы данных Microsoft Access. Выбор информации из базы данных. Работа с базой данных в режиме формы

    На этом шаге мы рассмотрим организацию такой работы.

    На практике используются два режима отображения данных: таблица и форма.

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

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

    Для отображения (редактирования) полей записей базы данных можно использовать компонент TextBox. Чтобы в поле компонента TextBox отображалось содержимое поля записи базы данных, его надо связать с соответствующим элементом набора данных — столбцом таблицы компонента DataSet. Связывание осуществляется путем установки значений свойств DataBinding.Text компонента TextBox. Связать компонент с источником данных можно во время создания формы (рисунок 1) или во время работы программы, добавив в конструктор соответствующие инструкции.


Рис.1. Связывание компонента TextBox с источником данных

    В качестве примера рассмотрим программу, которая обеспечивает работу с базой "Контакты" в режиме формы.

    Форма программы работы с БД "Контакты" приведена на рисунке 2. В полях textBox1—textBox3 отображается, соответственно, содержимое полей name, phone и email текущей записи. Следует обратить внимание на то, что за компонентом pictureBox1 "спрятан" компонент textBox4. В нем находится имя файла иллюстрации (содержимое поля img), а сама иллюстрация отображается в поле pictureBox1.


Рис.2. Форма программы работы с базой данных "Контакты" (режим формы)

    Конструктор формы и функции обработки событий приведены ниже.

.   .   .   .   .
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// файл базы данных в папке Документы 
	dbPath = Environment::GetFolderPath 
		(Environment::SpecialFolder::MyDocuments); 
	// задать строку соединения 
	oleDbConnection1->ConnectionString = 
		"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
		dbPath + "\\Contacts\\contacts.mdb"; 
	// папка Images находится в папке Документы 
	imFolder = dbPath + "\\Contacts\\Images\\"; 
	// показать имя файла БД в строке состояния 
	toolStripStatusLabel1->Text = dbPath + "\\Contacts\\contacts.mdb"; 
	// связать компоненты textBox1-textBox4 с источником данных 
	textBox1->DataBindings->Add((gcnew 
		Binding(L"Text", dataSet1, L"contacts.name", true))); 
	textBox2->DataBindings->Add((gcnew 
		Binding(L"Text", dataSet1, L"contacts.phone", true))); 
	textBox3->DataBindings->Add((gcnew 
		Binding(L"Text", dataSet1, L"contacts.email", true))); 
	textBox4->DataBindings->Add((gcnew 
		Binding(L"Text", dataSet1, L"contacts.img", true))); 
	// загрузить данные 
	oleDbDataAdapter1->Fill(dataTable1); 
}
.   .   .   .   .
private: 
	String^ dbPath; // папка приложения 
	String^ imFolder; // папка иллюстраций 

// Начало работы программы 
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
	 // Так как у команды SELECT есть параметр, 
	 // который задает критерий отбора записей, 
	 // то надо задать его значение: 
	 // oleDbDataAdapter1->SelectCommand->Parameters[0]->Value = "%%"; 
	 // прочитать данные из БД - выполнить команду SELECT 
	 oleDbDataAdapter1->Fill(dataTable1); 
 }
// Пользователь выделил строку и нажал клавишу Delete
private: System::Void dataGridView1_UserDeletingRow(System::Object^  sender, 
	 System::Windows::Forms::DataGridViewRowCancelEventArgs^  e) {
             System::Windows::Forms::DialogResult dr = 
	 MessageBox::Show("Удалить запись?", 
		 "Удаление записи", 
		 MessageBoxButtons::OKCancel, 
		 MessageBoxIcon::Warning, 
		 MessageBoxDefaultButton::Button2); 
	 if (dr == System::Windows::Forms::DialogResult::Yes) 
	 {
		 e->Cancel = true; 
	 }
 }
// Завершение работы программы 
private: System::Void Form1_FormClosing(System::Object^  sender, 
	 System::Windows::Forms::FormClosingEventArgs^  e) {
	// Обновить данные 
       oleDbDataAdapter1->Update(dataSet1->Tables["contacts"]);
 }
// изменилось содержимое поля textBox4 - 
// отобразить иллюстрацию, имя файла которой находится в этом поле 
private: System::Void textBox4_TextChanged(System::Object^  sender, 
	System::EventArgs^  e) {
	 String^ imageFile; 
	 String^ msg; // сообщение об ошибке 

	 if (textBox4->Text == String::Empty) 
	 {
		 imageFile = imFolder + "nobody.jpg"; 
	 }
	 else 
		 imageFile = imFolder + textBox4->Text;
	 // отобразить иллюстрацию 
	 try 
	 {
		 msg = ""; 
		 pictureBox1->Image = System::Drawing::Bitmap::FromFile(imageFile); 
	 }
	 catch (System::IO::FileNotFoundException^ e) 
	 {
		 // вывести сообщение об ошибке в поле 
		 // компонента pictureBox1 
		 msg = "File nof found: " + imageFile; 
			 pictureBox1->Image = nullptr; 
			 pictureBox1->Refresh(); 
	 }
 }
// щелчок на компоненте pictureBox1 
private: System::Void pictureBox1_Click(System::Object^  sender, 
	System::EventArgs^  e) {
	 openFileDialog1->Title = "Выберите иллюстрацию"; 
	 openFileDialog1->InitialDirectory = imFolder; 
	 openFileDialog1->Filter = "фото|*.jpg|все файлы|*.*"; 
	 openFileDialog1->FileName = ""; 
	 if (openFileDialog1->ShowDialog() == 
		 System::Windows::Forms::DialogResult::OK) 
	 {
		 // пользователь указал файл иллюстрации 
		 // проверим, находится ли выбранный файл в каталоге imFolder 
		 bool r = openFileDialog1->FileName->ToLower()->Contains( 
			 openFileDialog1->InitialDirectory->ToLower()); 
		 if (r == true) 
		 {
			 // копировать не надо, т. к. пользователь указал иллюстрацию, 
			 // которая находится в imFolder 
			 textBox4->Text = openFileDialog1->SafeFileName; 
		 }
		 else 
		 {
			 // Скопировать файл иллюстрации в папку Images. 
			 // Если в каталоге-приемнике есть файл 
			 // с таким же именем, что и копируемый, 
			 // возникает исключение 
			 try 
			 {
				 // копировать файл 
				 System::IO::File::Copy(openFileDialog1->FileName, 
					 imFolder + openFileDialog1->SafeFileName);
				 textBox4->Text = openFileDialog1->SafeFileName; 
			 }
			 catch (System::Exception^ e) 
			 {
				 System::Windows::Forms::DialogResult dr; 
				 dr = MessageBox::Show(e->Message + 
					 " Заменить его?", "", 
					 MessageBoxButtons::OKCancel, 
					 MessageBoxIcon::Warning, 
					 MessageBoxDefaultButton::Button2); 
				 if (dr == System::Windows::Forms::DialogResult::OK) 
				 {
				    // перезаписать файл 
				    System::IO::File::Copy(openFileDialog1->FileName, 
					 imFolder + openFileDialog1->SafeFileName, 
					 true); 
				    textBox4->Text = openFileDialog1->SafeFileName; 
				 }
			 }
		 }
	 }
 }
Архив проекта вместе с базой данных можно взять здесь.

    Результат работы приложения:


Рис.3. Результат работы приложения

    На следующем шаге мы рассмотрим сервер баз данных Microsoft SQL Server Compact Edition.




Предыдущий шаг Содержание Следующий шаг