|
Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
ToolBox, т. кв нем отражены только самые необходимые компоненты на взгляд разработчика среды. Остальные, предусмотренные средой программирования, вы можете подключить сами к воспользовавшись опцией главного меню Choose ToolBox Items. Откроется диалоговое окно со списком подключаемых компонентов, в котором в соответствующей папке (для начинающих — это компоненты из папки Framework...) следует найти нужный подключаемый компонент и слева от него поставить галочку. После закрытия окна компонент попадет в ToolBox. После oleDbDataAdapter берется другой компонент dataSet . В нем создается таблица по структуре, совпадающая с таблицей из БД. Затем берется третий компонент dataGridView . Он настраивается на высветку строк из таблицы, которая создается в предыдущем компоненте вручную на этапе проектирования. Тогда первого заставляют с помощью специальных команд достать из БД данные и записать в таблицу второго, а третий, связанный со вторым, должен на экране отразить то, что второй получил. Кроме этих трех основных, необходимо работать еще с четырьмя oleDbConnection — этот компонент появляется на поддоне формы, когда мы установили связь с БД через oleDbDataAdapter . Появляется как спутник. Дело в том, что у этого компонента есть свойство, через которое формируется так называемая строка соединения — путь от приложения к таблице БД. Поэтому через такой компонент можно самостоятельно подсоединиться к БД. Нов данном случае удобнее подсоединяться сразу через oleDbDataAdapter ; dataGridView — через этот компонент на экран выводится таблица из БД, с которой мы намерены работать, которую достали поместил в dataSet . Компонент позволяет легко корректировать таблицу и отсылать ее обратно в БД; bindingSource — компонент содержит связь с чтобы через нее передать данные таблицы из БД компоненту dataGridView ; bindingNavigator — компонент управляет действиями по работе пользователя с таблицей данных, выводимых на экран компонентом dataGridView перемещение по элементам таблицы, добавление элементов, удаление элементов, другие действия, связанные с обработкой элементов, которые можно осуществлять, обрабатывая события этого компонента. Пример работы с базой данных С помощью средств MS Access создадим БД, состоящую из одной таблицы, которую назовем условно "Авторы. Как создавать такие таблицы в среде MS Access мы здесь не рассматриваем. Это не входит в нашу задачу. Отметим только один странный момент (возможно, что это недоработка разработчика среды, что если создать БД MS Access версии, поставляемой сто компоненты типа ole 426 Часть II. Приложения Windows Form ( oleDbConnection , например) не работают с такой БД. В Интернете полно жалоб поэтому поводу. Поэтому, если мы хотим воспользоваться инструментом MS Access, следует создать БД более ранней версии. Хорошо, что этот вариант предусмотрен в поставляемой новой версии MS Access. Таким образом, создадим таблицу "Авторы" MS Access версии 2000, например. Расширение ее файла — mdb. Расширение же файлов новейшей версии MS Access — accdb. Вид таблицы показан на рис. 12.2. Рис 12.2. Таблица "Авторы" Отметим, что при создании таблицы первое ее поле — автоматический счетчик строк — является ключевым полем у него одним из свойств является то, что это поле индексированное и не может иметь более одного значения, те. уникальное. Об этом надо помнить, т. к. при настройке компонентов работы с БД нам придется это учитывать. Начнем создавать приложение по технологии, описанной выше. Создадим приложение обычным путем, выполнив опции File | NewProject | Windows Forms Application. На экране увидим пустую форму, которую нам предстоит заполнить. Поместим в форму компонент oleDbDataAdapter (в дальнейшем — адаптер. Тут же откроется диалоговое окно для подключения к БД. Если мы ранее подключались к какой-то БД, то ее имя высветится в окне. Если нас эта БД устраивает, то нажимаем на OK и идем дальше. Если нет, нажимаем на кнопку New рис. 12.3). Отметим, что все связи с базами данных, устанавливаемыми приложениями, отражаются в окне Server Explorer (вкладка для открытия окна — рядом с вкладкой ToolBox в правом торце рабочего стола. Если вам мешают эти данные, то можно их удалить через это окно, воспользовавшись его контекстным меню. Тогда, например, в открывшемся окне, показанном на рис. 12.3, не появится последняя БД, с которой была установлена связь. Но можно воспользоваться и возможностью заранее установить связь с БД. Для этого следует выполнить опции главного меню Tools | Connect to DataBase. Далее необходимо выполнить шаги, описанные ниже, когда мы настраиваем адаптер и дошли до шага, когда нажимаем на кнопку New Connection. После нажатия на кнопку New Connection открывается окно для организации непосредственной связи с базой данных (рис. 12.4). Смотрим на поле Data source (источник данных. Источник Microsoft SQL Server (OLE DB) нас не устраивает, т. к. мы работаем с БД типа MS Access. Поэтому
Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.3. Выбор соединения с БД Рис. 12.4. Окно организации связи с БД
428 Часть II. Приложения Windows Рис 12.5. Выбор типа источника данных нажимаем кнопку Change (изменить. Открывается диалоговое окно для выбора подходящего типа источника данных (рис. 12.5). После нажатия на кнопку О, появится окно, показанное на рис. 12.6. Кнопкой Browse находим нашу БД (рис. 12.7). Остается проверить, действительно ли произошло соединение с БД. Для этого нажимаем на кнопку Test Connection (проверить соединение. Результат — на рис. 12.8. Рис 12.6. Окно для поиска БД типа выбранной на предыдущем шаге Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.7. Путь к БД Рис. 12.8. Проверка соединения с БД Видим, что соединение произошло. Переходим к следующему шагу после нажатия на кнопку О, появится знакомое уже диалоговое окно, в котором отразилось найденное соединение (рис. 12.9). Рис 12.9. Окно соединения с источником данных 430 Часть II. Приложения Windows Нажимаем на кнопку Next, в результате чего получаем открытое окно, показанное на рис. 12.10. Видим, что переключатель выбора работы с хранимыми процедурами заблокирован, и нам остается только нажать на кнопку Next. Откроется диалоговое окно, показанное на рис. 12.11, окно для определения оператора выборки данных из БД, с которой ранее было соединение. Рис 12.10. Окно выбора работы с SQL - операторами или с хранимыми процедурами Рис. 12.11. Работа с SQL - операторами Глава 12. Работа с наборами данных. Общие сведения о базах данных Мы можем сами написать оператор SELECT , который должен выбирать данные из таблицы "Авторы. Номы воспользуемся кнопкой Query Builder (построитель запроса, которая откроет окно для выбора конструкции оператора рис. 12.12). В данном примере мы работаем с таблицей "Авторы, поэтому выбираем вариант, показанный на рис. 12.12, и нажимаем на кнопку Add (добавить. Рис 12.12. Построение оператора Нажимаем на кнопку Close (закрыть, окно закрывается, и мы видим окно, показанное на рис. 12.13. Теперь мы можем галочками отметить поля в таблице окна "Авторы, которые станут выбираться из таблицы БД, а затем проверить правильность сформированного на основании отмеченных полей оператора SELECT , нажав на кнопку Execute Query выполнить запрос. Результат этих действий — на рис. 12.14. Из рисунка видно, что связь с БД построена верно, и выборка данных происходит. Нажмем на кнопку О и попадем в окно, показанное на рис. 12.15. Нажимаем на кнопку Next, попадаем в окно, показанное на рис. 12.16. Нажимаем на кнопку Finish, попадаем снова в окно с формой конфигурация (настройка) адаптера завершена. Теперь он может доставать таблицу из БД и обеспечивать ее ведение. Займемся теперь компонентом dataSet . Откроем свойства компонента (рис. 12.17). Обратим внимание на свойство Tables (таблицы. Справа от названия свойства — поле этого свойства, в котором написано Collection (множество. То есть имеется
432 Часть II. Приложения Windows Рис 12.13. Формирование оператора на основании выбранной таблицы БД в виду, что таблиц может быть много. Почему База данных может содержать не одну таблицу, а множество. Номы зададим (построим) с помощью этого свойства только одну таблицу такую, структура которой совпадает по структуре с таблицей "Авторы. Щелкаем на кнопке с многоточием в поле рассматриваемого свойства (сначала надо щелкнуть на свойстве — отметить его тогда появится кнопка с многоточием. Открывается пустое диалоговое окно. В нем щелкаем на кнопке Add: в левое поле окна добавляется строка Table1 , а в правом поле окна появляются свойства Table1 , которые определяют создаваемый объект (рис. 12.18). Одним из свойств, которое нас интересует в данный момент, является свойство Columns (столбцы. Раньше мы рассмотрели, что именно столбцы определяют суть таблицы. Щелкнем в поле этого свойства. Там же, в поле, появится кнопка с многоточием. Щелкнем на этой кнопке. Откроется диалоговое окно для формирования столбцов будущей формы. Окно такое же, как и для задания таблиц. Добавим кнопкой шесть элементов в левую часть окна. В правой части обратим внимание на свойства Caption (название столбца, Data Type (тип данных в столбце) и Unique (задается единственность, уникальность элементов в этом поле при переходе от одной строки таблицы к другой, точнее — неповторяемость. Если задать это свойство как true , то такое поле можно брать в качестве элемента ключа в таблице. В нашей
Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.14. Действие сформированного оператора Рис 12.15. Построенный оператор SELECT
434 Часть II. Приложения Windows Рис 12.16. Окно с информацией, какие SQL - операторы сформированы для работы с таблицей БД Рис. 12.17. Свойства dataSet
Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.18. Диалоговое окно для задания (создания, построения) таблиц таблице "Авторы" все поля имеют строковый тип, что совпадает с принятым типом по умолчанию для свойства Data Но самое первое поле должно быть ключевым, потому что мы строим таблицу по структуре идентичную таблице "Авторы. Поэтому у столбца с именем Column1 надо изменить тип данного на int 64 (двойное целое) и задать свойство Unique=true . Названия пока оставим те, что сформировала среда (для простоты. Поэтому формирование таблицы можно считать законченным. Вид ее показан на рис. 12.19. Остался еще один момент уточнить свойство построенной таблицы, которое называется (первичный ключ. Если щелкнуть в поле этого свойства, откроется кнопка, нажав на которую увидим список полей таблицы, которые могут служить первичным ключом (одно поле или совокупность полей. Надо проставить галочки утех полей, которые образуют первичный ключ. В нашем случае первичный ключ образует поле Column1 . Его и помечаем (рис. 12.20). Таким образом, с компонентом dataSet разобрались. То есть сформировали адаптер, который свяжется с таблицей в БД MS Access и заполнит ее данными только что построенную таблицу Table1 в Теперь надо обеспечить вывод Table1 на экран для просмотра и корректировки ее данных, чтобы потом уже откорректированную таблицу снова вернуть в БД (ранее мы отмечали, что dataSet работает только в памяти, а чтобы его содержимое попало назад в БД, это содержимое надо принудительно туда записать. Это делает как раз метод Update , созданный ранее в адаптере. Рассмотрим компонент bindingSource . Перечень его свойств и их настройка показаны на рис. 12.21.
436 Часть II. Приложения Windows Рис 12.19. Таблица, сформированная в компоненте Рис 12.20. Выбор первичного ключа в построенной таблице Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 1 2 .2 1 . Свойства и их настройка Часть II. Приложения Windows По настройкам видно, что этот компонент связывается с объектом dataSet и его членом Table1 . Вот эти-то элементы и попадут как связующие в следующий компонент, который призван показать наполненную данными из базы данных таблицу Table1 на экране. Этот компонент — dataGridView , его вид в форме показан на рис. 12.22. Настройка свойств компонента показана на рис. 12.23. Рис 12.22. dataGridView в форме приложения Рис. 12.23. Настройка свойств dataGridView
Глава 12. Работа с наборами данных. Общие сведения о базах данных Итак, dataGridView станет высвечивать на экране таблицу Table1 . Но управлять перемещением по этой таблице, ее корректировкой призван другой компонент. Это bindingNavigator или просто Навигатор. Связь его с dataGridView — через Эта связь устанавливается так, как показано на рис. 12.24. Вид Навигатора в форме показан также на рис. 12.24. Рис 12.24. Установление связи Навигатора с dataGridView через Остался еще один невыполненный шаг создание таблицы соответствия полей исходной БД и построенной. Такая таблица определяется как свойство компонента адаптер. Это свойство называется TableMappings (схема связей в таблицах. Эта схема показана на рис. 12.25. Добавим теперь в форму приложения три кнопки. Первая будет вызывать команду запуска адаптера и заполнение им таблицы Table1 , вторая — вызывать команду записи обновленной в памяти Table1 обратно в БД, третья — вызывать команду завершения приложения. Обработчики этих кнопок приведены в листинге 12.1. Листинг 12.1 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { // загрузить данные из БД this->dataSet1->Clear(); Очистка буфера перед чтением туда таблицы this->oleDbDataAdapter1->Fill(dataTable1); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Сохранить данные в БД Авторы }
440 Часть II. Приложения Windows Form private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { Выйти из приложения this->Close(); } Рис 12.25. Таблица соответствий между элементами таблицы из БД и таблицы из Вид формы приложения перед компиляцией показан на рис. 12.26. Компилируем приложение, нажав на клавишу . Компиляция прошла успешно. Запускаем приложение на выполнение клавишей . Вид формы после компиляции и запуска на выполнение показан на рис. 12.27. Нажимаем на кнопку Загрузить данные из БД в таблицу. Результат показан на рис. 12.28. Проверим, происходит ли удаление строк, добавка строк, изменение значений некоторых полей строки, наконец, пересылка откорректированной таблицы обратно в БД. Результаты этих действий показаны на рис. 12.29 и 12.30. Когда происходило испытание приложения в режиме добавления строки (это делалось кнопкой "Плюс" Навигатора, по которой создается пустая строка, куда вписываются данные полей, среда программирования требовала, чтобы задавался ключ
Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.26. Вид формы приложения перед компиляцией Рис. 12.27. Вид формы после компиляции и запуска на выполнение Рис. 12.28. Загрузка таблицы "Авторы" из БД
442 Часть II. Приложения Windows Рис 12.29. Откорректированная в памяти (на экране) таблица "Авторы" и отосланная назад в БД Рис. 12.30. Прочитанная снова таблица "Авторы" строки, те. значение поля в колонке Column1 . Это очень неудобно, т. к. значение ключевого поля трудно выбрать уникальным, когда в таблице много строк. Оказывается, из этой неприятности есть выход. Надо открыть свойства колонок таблицы в dataSet и у ключевого поля Column1 изменить свойство AutoIncrement (автоматическое наращивание по единице) сна (рис. 12.31). Приложение, реализующее рассмотренное выше решение, приводится в листинге. Листинг 12.2 #pragma once namespace db2011длягл122 { using namespace System; using namespace System::ComponentModel;
Глава 12. Работа с наборами данных. Общие сведения о базах данных Рис 12.31. Придание ключевому полю таблицы свойства автоматического наращивания значения using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// /// Summary for Form1 /// public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // } protected: /// /// Clean up any resources being used. /// Form1()
444 Часть II. Приложения Windows Form { if (components) { delete components; } } private: System::Data::OleDb::OleDbCommand^ oleDbSelectCommand1; protected: private: System::Data::OleDb::OleDbCommand^ oleDbInsertCommand1; private: System::Data::OleDb::OleDbCommand^ oleDbUpdateCommand1; private: System::Data::OleDb::OleDbCommand^ oleDbDeleteCommand1; private: System::Data::OleDb::OleDbDataAdapter^ oleDbDataAdapter1; private: System::Data::OleDb::OleDbConnection^ oleDbConnection1; private: System::Windows::Forms::BindingSource^ bindingSource1; private: System::Data::DataSet^ dataSet1; private: System::Data::DataTable^ dataTable1; private: System::Data::DataColumn^ dataColumn1; private: System::Data::DataColumn^ dataColumn2; private: System::Data::DataColumn^ dataColumn3; private: System::Data::DataColumn^ dataColumn4; private: System::Data::DataColumn^ dataColumn5; private: System::Data::DataColumn^ dataColumn6; private: System::Windows::Forms::BindingNavigator^ bindingNavigator1; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorAddNewItem; private: System::Windows::Forms::ToolStripLabel^ bindingNavigatorCountItem; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorDeleteItem; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorMoveFirstItem; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorMovePreviousItem; private: System::Windows::Forms::ToolStripSeparator^ bindingNavigatorSeparator; private: System::Windows::Forms::ToolStripTextBox^ bindingNavigatorPositionItem; private: System::Windows::Forms::ToolStripSeparator^ bindingNavigatorSeparator1; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorMoveNextItem; private: System::Windows::Forms::ToolStripButton^ bindingNavigatorMoveLastItem; private: System::Windows::Forms::ToolStripSeparator^ bindingNavigatorSeparator2; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::DataGridView^ dataGridView1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Button^ button3;
Глава 12. Работа с наборами данных. Общие сведения о базах данных private: System::Windows::Forms::DataGridViewTextBoxColumn^ Column1; private: System::Windows::Forms::DataGridViewTextBoxColumn^ column2DataGridViewTextBoxColumn; private: System::Windows::Forms::DataGridViewTextBoxColumn^ column3DataGridViewTextBoxColumn; private: System::Windows::Forms::DataGridViewTextBoxColumn^ column4DataGridViewTextBoxColumn; private: System::Windows::Forms::DataGridViewTextBoxColumn^ column5DataGridViewTextBoxColumn; private: System::Windows::Forms::DataGridViewTextBoxColumn^ column6DataGridViewTextBoxColumn; private: System::ComponentModel::IContainer^ components; private: /// /// Required designer variable. /// #pragma region Windows Form Designer generated code /// /// Required method for Designer support — do not modify /// the contents of this method with the code editor. /// void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid)); this->oleDbSelectCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbConnection1 = (gcnew System::Data::OleDb::OleDbConnection()); this->oleDbInsertCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbUpdateCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbDeleteCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbDataAdapter1 = (gcnew System::Data::OleDb::OleDbDataAdapter()); this->bindingSource1 = (gcnew System::Windows::Forms::BindingSource(this->components)); this->dataSet1 = (gcnew System::Data::DataSet()); this->dataTable1 = (gcnew System::Data::DataTable()); this->dataColumn1 = (gcnew System::Data::DataColumn()); this->dataColumn2 = (gcnew System::Data::DataColumn()); this->dataColumn3 = (gcnew System::Data::DataColumn()); this->dataColumn4 = (gcnew System::Data::DataColumn());
446 Часть II. Приложения Windows Form this->dataColumn5 = (gcnew System::Data::DataColumn()); this->dataColumn6 = (gcnew System::Data::DataColumn()); this->bindingNavigator1 = (gcnew System::Windows::Forms::BindingNavigator(this->components)); this->bindingNavigatorAddNewItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorCountItem = (gcnew System::Windows::Forms::ToolStripLabel()); this->bindingNavigatorDeleteItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorMoveFirstItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorMovePreviousItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorSeparator = (gcnew System::Windows::Forms::ToolStripSeparator()); this->bindingNavigatorPositionItem = (gcnew System::Windows::Forms::ToolStripTextBox()); this->bindingNavigatorSeparator1 = (gcnew System::Windows::Forms::ToolStripSeparator()); this->bindingNavigatorMoveNextItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorMoveLastItem = (gcnew System::Windows::Forms::ToolStripButton()); this->bindingNavigatorSeparator2 = (gcnew System::Windows::Forms::ToolStripSeparator()); this->button1 = (gcnew System::Windows::Forms::Button()); this->dataGridView1 = (gcnew System::Windows::Forms::DataGridView()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->Column1 = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); this->column2DataGridViewTextBoxColumn = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); this->column3DataGridViewTextBoxColumn = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); this->column4DataGridViewTextBoxColumn = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); this->column5DataGridViewTextBoxColumn = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); this->column6DataGridViewTextBoxColumn = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn()); (cli::safe_cast(this- >bindingSource1))->BeginInit(); (cli::safe_cast(this- >dataSet1))->BeginInit(); (cli::safe_cast(this- >dataTable1))->BeginInit(); (cli::safe_cast(this- >bindingNavigator1))->BeginInit();
Глава 12. Работа с наборами данных. Общие сведения о базах данных this->bindingNavigator1->SuspendLayout(); (cli::safe_cast(this- >dataGridView1))->BeginInit(); this->SuspendLayout(); // // oleDbSelectCommand1 // this->oleDbSelectCommand1->CommandText = L"SELECT Авторы Авторы this->oleDbSelectCommand1->Connection = this->oleDbConnection1; // // oleDbConnection1 // this->oleDbConnection1->ConnectionString = L"Provider=Microsoft.Jet.OLEDB.4.0;Data База данных MSAccess\\MSAccess-" L"2000\\Database1.mdb\""; // // oleDbInsertCommand1 // this->oleDbInsertCommand1->CommandText = L"INSERT INTO Авторы Поле, Поле, Поле, Поле, Поле) VALUES (\?, \?, " L"\?, \?, \?)"; this->oleDbInsertCommand1->Connection = this->oleDbConnection1; this->oleDbInsertCommand1->Parameters->AddRange(gcnew cli::array< System::Data::OleDb::OleDbParameter^ >(5) {(gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле // // oleDbUpdateCommand1 // this->oleDbUpdateCommand1->CommandText = resources- >GetString(L"oleDbUpdateCommand1.CommandText"); this->oleDbUpdateCommand1->Connection = this->oleDbConnection1; this->oleDbUpdateCommand1->Parameters->AddRange(gcnew cli::array< System::Data::OleDb::OleDbParameter^ >(16) {(gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar,
448 Часть II. Приложения Windows Form 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, Поле, (gcnew Код, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Код, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)),
Глава 12. Работа с наборами данных. Общие сведения о базах данных (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr))}); // // oleDbDeleteCommand1 // this->oleDbDeleteCommand1->CommandText = resources- >GetString(L"oleDbDeleteCommand1.CommandText"); this->oleDbDeleteCommand1->Connection = this->oleDbConnection1; this->oleDbDeleteCommand1->Parameters->AddRange(gcnew cli::array< System::Data::OleDb::OleDbParameter^ >(11) {(gcnew Код, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Код, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле,
450 Часть II. Приложения Windows Form System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::Integer, 0, System::Data::ParameterDirection::Input, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, true, nullptr)), (gcnew Поле, System::Data::OleDb::OleDbType::VarWChar, 0, System::Data::ParameterDirection::Input, false, static_cast(0), static_cast(0), Поле, System::Data::DataRowVersion::Original, nullptr))}); // // oleDbDataAdapter1 // this->oleDbDataAdapter1->DeleteCommand = this->oleDbDeleteCommand1; this->oleDbDataAdapter1->InsertCommand = this->oleDbInsertCommand1; this->oleDbDataAdapter1->SelectCommand = this->oleDbSelectCommand1; cli::array< System::Data::Common::DataColumnMapping^ >^ __mcTemp__1 = gcnew cli::array< System::Data::Common::DataColumnMapping^ >(6) {(gcnew Код, L"Column1")), (gcnew Поле, L"Column2")), (gcnew Поле, L"Column3")), (gcnew Поле, L"Column4")), (gcnew Поле, L"Column5")), (gcnew Поле, L"Column6"))}; this->oleDbDataAdapter1->TableMappings->AddRange(gcnew cli::array< System::Data::Common::DataTableMapping^ >(1) {(gcnew System::Data::Common::DataTableMapping(L"Table", Авторы, __mcTemp__1))}); this->oleDbDataAdapter1->UpdateCommand = this->oleDbUpdateCommand1;
Глава 12. Работа с наборами данных. Общие сведения о базах данных // // bindingSource1 // this->bindingSource1->DataMember = Авторы this->bindingSource1->DataSource = this->dataSet1; this->bindingSource1->Sort = L"Column2"; // // dataSet1 // this->dataSet1->DataSetName = L"NewDataSet"; this->dataSet1->Tables->AddRange(gcnew cli::array< System::Data::DataTable^ >(1) {this->dataTable1}); // // dataTable1 // this->dataTable1->Columns->AddRange(gcnew cli::array< System::Data::DataColumn^ >(6) {this->dataColumn1, this->dataColumn2, this->dataColumn3, this->dataColumn4, this->dataColumn5, this- >dataColumn6}); cli::array< System::String^ >^ __mcTemp__2 = gcnew cli::array< System::String^ >(1) {L"Column1"}; this->dataTable1->Constraints->AddRange(gcnew cli::array< System::Data::Constraint^ >(1) {(gcnew System::Data::UniqueConstraint(L"Constraint1", __mcTemp__2, true))}); this->dataTable1->PrimaryKey = gcnew cli::array< System::Data::DataColumn^ >(1) {this->dataColumn1}; this->dataTable1->TableName = Авторы // // dataColumn1 // this->dataColumn1->AllowDBNull = false; this->dataColumn1->AutoIncrement = true; this->dataColumn1->ColumnName = L"Column1"; this->dataColumn1->DataType = System::Int64::typeid; // // dataColumn2 // this->dataColumn2->ColumnName = L"Column2"; // // dataColumn3 // this->dataColumn3->ColumnName = L"Column3"; // // dataColumn4 // this->dataColumn4->ColumnName = L"Column4"; // // dataColumn5 //
452 Часть II. Приложения Windows Form this->dataColumn5->ColumnName = L"Column5"; // // dataColumn6 // this->dataColumn6->ColumnName = L"Column6"; // // bindingNavigator1 // this->bindingNavigator1->AddNewItem = this- >bindingNavigatorAddNewItem; this->bindingNavigator1->BindingSource = this->bindingSource1; this->bindingNavigator1->CountItem = this->bindingNavigatorCountItem; this->bindingNavigator1->DeleteItem = this- >bindingNavigatorDeleteItem; this->bindingNavigator1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(11) {this- >bindingNavigatorMoveFirstItem, this->bindingNavigatorMovePreviousItem, this- >bindingNavigatorSeparator, this->bindingNavigatorPositionItem, this- >bindingNavigatorCountItem, this->bindingNavigatorSeparator1, this- >bindingNavigatorMoveNextItem, this->bindingNavigatorMoveLastItem, this- >bindingNavigatorSeparator2, this->bindingNavigatorAddNewItem, this- >bindingNavigatorDeleteItem}); this->bindingNavigator1->Location = System::Drawing::Point(0, 0); this->bindingNavigator1->MoveFirstItem = this- >bindingNavigatorMoveFirstItem; this->bindingNavigator1->MoveLastItem = this- >bindingNavigatorMoveLastItem; this->bindingNavigator1->MoveNextItem = this- >bindingNavigatorMoveNextItem; this->bindingNavigator1->MovePreviousItem = this- >bindingNavigatorMovePreviousItem; this->bindingNavigator1->Name = L"bindingNavigator1"; this->bindingNavigator1->PositionItem = this- >bindingNavigatorPositionItem; this->bindingNavigator1->Size = System::Drawing::Size(654, 27); this->bindingNavigator1->TabIndex = 1; this->bindingNavigator1->Text = L"bindingNavigator1"; // // bindingNavigatorAddNewItem // this->bindingNavigatorAddNewItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorAddNewItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorAddNewItem.Image"))); this->bindingNavigatorAddNewItem->Name = L"bindingNavigatorAddNewItem";
Глава 12. Работа с наборами данных. Общие сведения о базах данных this->bindingNavigatorAddNewItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorAddNewItem->Size = System::Drawing::Size(23, 24); this->bindingNavigatorAddNewItem->Text = L"Add new"; // // bindingNavigatorCountItem // this->bindingNavigatorCountItem->Name = L"bindingNavigatorCountItem"; this->bindingNavigatorCountItem->Size = System::Drawing::Size(45, 24); this->bindingNavigatorCountItem->Text = L"of {0}"; this->bindingNavigatorCountItem->ToolTipText = L"Total number of items"; // // bindingNavigatorDeleteItem // this->bindingNavigatorDeleteItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorDeleteItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorDeleteItem.Image"))); this->bindingNavigatorDeleteItem->Name = L"bindingNavigatorDeleteItem"; this->bindingNavigatorDeleteItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorDeleteItem->Size = System::Drawing::Size(23, 24); this->bindingNavigatorDeleteItem->Text = L"Delete"; // // bindingNavigatorMoveFirstItem // this->bindingNavigatorMoveFirstItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorMoveFirstItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorMoveFirstItem.Image"))); this->bindingNavigatorMoveFirstItem->Name = L"bindingNavigatorMoveFirstItem"; this->bindingNavigatorMoveFirstItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorMoveFirstItem->Size = System::Drawing:: Size(23, 24); this->bindingNavigatorMoveFirstItem->Text = L"Move first"; // // bindingNavigatorMovePreviousItem // this->bindingNavigatorMovePreviousItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorMovePreviousItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorMovePreviousItem.Image"))); this->bindingNavigatorMovePreviousItem->Name = L"bindingNavigatorMovePreviousItem";
454 Часть II. Приложения Windows Form this->bindingNavigatorMovePreviousItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorMovePreviousItem->Size = System::Drawing::Size(23, 24); this->bindingNavigatorMovePreviousItem->Text = L"Move previous"; // // bindingNavigatorSeparator // this->bindingNavigatorSeparator->Name = L"bindingNavigatorSeparator"; this->bindingNavigatorSeparator->Size = System::Drawing::Size(6, 27); // // bindingNavigatorPositionItem // this->bindingNavigatorPositionItem->AccessibleName = L"Position"; this->bindingNavigatorPositionItem->AutoSize = false; this->bindingNavigatorPositionItem->Name = L"bindingNavigatorPositionItem"; this->bindingNavigatorPositionItem->Size = System::Drawing::Size(50, 27); this->bindingNavigatorPositionItem->Text = L"0"; this->bindingNavigatorPositionItem->ToolTipText = L"Current position"; // // bindingNavigatorSeparator1 // this->bindingNavigatorSeparator1->Name = L"bindingNavigatorSeparator1"; this->bindingNavigatorSeparator1->Size = System::Drawing::Size(6, 27); // // bindingNavigatorMoveNextItem // this->bindingNavigatorMoveNextItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorMoveNextItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorMoveNextItem.Image"))); this->bindingNavigatorMoveNextItem->Name = L"bindingNavigatorMoveNextItem"; this->bindingNavigatorMoveNextItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorMoveNextItem->Size = System::Drawing::Size(23, 24); this->bindingNavigatorMoveNextItem->Text = L"Move next"; // // bindingNavigatorMoveLastItem // this->bindingNavigatorMoveLastItem->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Image; this->bindingNavigatorMoveLastItem->Image = (cli::safe_cast(resources- >GetObject(L"bindingNavigatorMoveLastItem.Image"))); this->bindingNavigatorMoveLastItem->Name = L"bindingNavigatorMoveLastItem";
Глава 12. Работа с наборами данных. Общие сведения о базах данных this->bindingNavigatorMoveLastItem->RightToLeftAutoMirrorImage = true; this->bindingNavigatorMoveLastItem->Size = System::Drawing::Size(23, 24); this->bindingNavigatorMoveLastItem->Text = L"Move last"; // // bindingNavigatorSeparator2 // this->bindingNavigatorSeparator2->Name = L"bindingNavigatorSeparator2"; this->bindingNavigatorSeparator2->Size = System::Drawing::Size(6, 27); // // button1 // this->button1->Location = System::Drawing::Point(94, 206); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(122, 62); this->button1->TabIndex = 2; this->button1->Text = Загрузить данные из БД в таблицу this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // dataGridView1 // this->dataGridView1->AutoGenerateColumns = false; this->dataGridView1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize; this->dataGridView1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^ >(6) {this->Column1, this->column2DataGridViewTextBoxColumn, this- >column3DataGridViewTextBoxColumn, this->column4DataGridViewTextBoxColumn, this->column5DataGridViewTextBoxColumn, this->column6DataGridViewTextBoxColumn}); this->dataGridView1->DataSource = this->bindingSource1; this->dataGridView1->Location = System::Drawing::Point(12, 30); this->dataGridView1->Name = L"dataGridView1"; this->dataGridView1->RowTemplate->Height = 24; this->dataGridView1->Size = System::Drawing::Size(614, 170); this->dataGridView1->TabIndex = 3; // // button2 // this->button2->Location = System::Drawing::Point(266, 206); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(108, 62); this->button2->TabIndex = 4; this->button2->Text = Вернуть данные в БД"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
456 Часть II. Приложения Windows Form // // button3 // this->button3->Location = System::Drawing::Point(451, 206); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 62); this->button3->TabIndex = 5; this->button3->Text = Выход this->button3->UseVisualStyleBackColor = true; this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click); // // Column1 // this->Column1->DataPropertyName = L"Column1"; this->Column1->HeaderText = L"Column1"; this->Column1->Name = L"Column1"; // // column2DataGridViewTextBoxColumn // this->column2DataGridViewTextBoxColumn->DataPropertyName = L"Column2"; this->column2DataGridViewTextBoxColumn->HeaderText = L"Column2"; this->column2DataGridViewTextBoxColumn->Name = L"column2DataGridViewTextBoxColumn"; // // column3DataGridViewTextBoxColumn // this->column3DataGridViewTextBoxColumn->DataPropertyName = L"Column3"; this->column3DataGridViewTextBoxColumn->HeaderText = L"Column3"; this->column3DataGridViewTextBoxColumn->Name = L"column3DataGridViewTextBoxColumn"; // // column4DataGridViewTextBoxColumn // this->column4DataGridViewTextBoxColumn->DataPropertyName = L"Column4"; this->column4DataGridViewTextBoxColumn->HeaderText = L"Column4"; this->column4DataGridViewTextBoxColumn->Name = L"column4DataGridViewTextBoxColumn"; // // column5DataGridViewTextBoxColumn // this->column5DataGridViewTextBoxColumn->DataPropertyName = L"Column5"; this->column5DataGridViewTextBoxColumn->HeaderText = L"Column5"; this->column5DataGridViewTextBoxColumn->Name = L"column5DataGridViewTextBoxColumn"; // // column6DataGridViewTextBoxColumn // this->column6DataGridViewTextBoxColumn->DataPropertyName = L"Column6"; this->column6DataGridViewTextBoxColumn->HeaderText = L"Column6";
Глава 12. Работа с наборами данных. Общие сведения о базах данных this->column6DataGridViewTextBoxColumn->Name = L"column6DataGridViewTextBoxColumn"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(654, 280); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->dataGridView1); this->Controls->Add(this->button1); this->Controls->Add(this->bindingNavigator1); this->Name = L"Form1"; this->Text = L"Form1"; (cli::safe_cast>(this->bindingSource1))->EndInit(); (cli::safe_cast>(this->dataSet1))->EndInit(); (cli::safe_cast>(this->dataTable1))->EndInit(); (cli::safe_cast>(this->bindingNavigator1))->EndInit(); this->bindingNavigator1->ResumeLayout(false); this->bindingNavigator1->PerformLayout(); (cli::safe_cast>(this->dataGridView1))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->dataSet1->Clear(); Очистка буфера перед чтением в него таблицы this->oleDbDataAdapter1->Fill(dataTable1); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Сохранить данные в БД Авторы } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } }; }
458 Часть II. Приложения Windows Form
ГЛАВА Управление исключительными ситуациями В процессе исполнения приложений могут возникнуть так называемые исключения исключительные ситуации) — это аномальные явления (например, деление на ноль, превышение размерности массивов и т. п, которые требуют от программы определенной реакции. Ив этом случае либо вы в программе как-то реагируете на отклонения от нормального режима, либо система сама отреагирует обработает по- своему такую ситуацию, выдаст вам сообщение и, как правило, завершит выполнение программы. В таких случаях желательно не дожидаться реакции системы и самому предпринимать необходимые меры, те. управлять возникающими в процессе решения вашей задачи проблемами. Язык С+ обеспечивает в этом смысле встроенную поддержку для обработки возникающих исключений. Управление обработкой исключений состоит в реакции программы на возникновение неожидаемых ею событий. Кроме специальных операторов, перехватывающих исключения, существует особый класс System:: Exceptions , содержащий необходимые свойства и методы, помогающие обрабатывать исключительные ситуации. Например, в классе имеется свойство Message , содержащее описание возникшего исключения, или свойство Source , содержащее имя источника (приложения или объекта, где возникла ошибка. Можно воспользоваться свойством HelpLink , которое выдаст вам ссылку на соответствующий файл, описывающий возникшую ситуацию, или свойством HResult , в котором находится числовой код возникшей ошибки. В С+ процесс обработки исключительных ситуаций состоит в возникновении (говорят "в выбрасывании" — throwing) ситуаций ив последующем их захвате (catching) для обработки. Операторы |
|
|