Как сделать базу данных в консольном приложение на с
Совсем недавно мне необходимо было написать программу для удаленной работы с мускулом. В интернете, как не обидно, нашел лишь «скачайте бла-бла, подключите через include, и вот пример!». На практике не сработало, пришлось искать специалистов чтоб объяснили. Для исправления этого досадного отсутствия информации, выложу полное описание от «А» до «Я» по настройке и работе в среде Visual C++. Итак, приступим!
Данным образом настраивал Visual C++ 2008 и 2010. Т. к. особой разницы в интерфейсе разных версий визуалки нету, то и настройка проходит практически одинаково.
Перекидывания файлов окончены, теперь настроим сам С++:
1. Открываем Visual C++, создаем стандартный консольный проект, сохраняем в любое удобное место.
2. Обязательно (. ) выбираем режим постройки проекта Release. Если выбрать стандартный Debug, то нужно файлы сохранять в другие директории.
3. Открываем свойства проекта (в окне обозревателя решений правой кнопкой по проекту — свойства).
4. Выбираем «Свойства конфигурации — С/С++ — Общие — Дополнительные каталоги включаемых файлов», добавляем каталог include из папки с сервером (в моем случае D:\программирование\MySQL Server 5.1\include).
6. В свойствах проекта выбираем пункт «Свойства конфигурации — С/С++ — Компоновщик — Общие — Дополнительные каталоги библиотек», добавляем каталог lib/opt (в моем случае D:\программирование\MySQL Server 5.1\lib\opt).
7. В свойствах проекта выбираем пункт «Свойства конфигурации — С/С++ — Компоновщик — Ввод — Дополнительные зависимости», добавляем 2 значения mysqlcppconn-static.lib и libmysql.lib.
8. В свойствах проекта выбираем пункт «Свойства конфигурации — С/С++ — Препроцессор — Определения препроцессора», добавляем значение CPPCONN_PUBLIC_FUNC=.
9. Сохраняем свойства проекта.
Вот 2 простых примера работы с мускулом:
using namespace std;
int_tmain(intargc, _TCHAR* argv[])
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
mysql_set_character_set(conn, "utf8");
//Смотрим изменилась ли кодировка на нужную, по умалчанию идёт latin1
cout<<"connectioncharacterset: "<<mysql_character_set_name(conn) <<endl;
mysql_query(conn,"SELECT id, text FROM mnu"); //Делаем запрос к таблице по имени МНУ =)
if (res = mysql_store_result(conn)) while(row = mysql_fetch_row(res)) for (i=0 ; i <mysql_num_fields(res); i++) std::cout<<row[i] <<"\n"; //Выводим все что есть в базе через цикл
>
>
> elsefprintf(stderr, "%s\n", mysql_error(conn));
// Закрываем соединение с сервером базы данных
mysql_close(conn);
P. S. Спасибо Владимиру Будило за разъяснение темы, эта статья вышла благодаря его объяснениям.
Установка необходимых пакетов
После окончательной установки всех необходимых пакетов, вид вашего проекта в обозревателе решений должен быть вот таким:
Добавим в наш проект пространство имен System.Data.SQLite и напишем следующий метод подключения к базе данных:
Ошибка доступа к базе данных. Исключение: unable to open database fileСоздадим новую таблицу в наше базе данных. Для этого, допишем код метода Main() следующим образом:
Добавление записей в SQLite
Добавим одну запись в таблицу базы данных SQLite, используя все тот же объект типа SQLiteCommand :
В приведенном выше примере мы использовали в качестве запроса обычную строку с заранее известными параметрами запроса. Однако, удобнее использовать для добавления новых записей в БД SQLite запрос с параметрами. Сделать это можно, например, следующим образом:
Использование транзакций SQLite
Одной из претензий, которую предъявляли (и, иногда, продолжают предъявлять) новички в работе с SQLite к этой замечательной базе данных является то, что, по мнению новичков, запись в эту базу данных происходит очень медленно. Действительно, посмотрим на вот такой код:
Здесь мы пробуем записать в базу SQLite 1000 записей и, при этом, засекаем время выполнения операции. Вот, что покажет нам счётчик времени выполнения операции:
и посмотрим, что покажет счётчик времени выполнения операции:
Как видите, выполнение транзакции в SQLite позволило сократить время выполнения операции более, чем на 99%.
У SQLiteDataAdapter есть несколько конструкторов, позволяющих создать объект. Мы воспользовались только одним из нихПосле этого мы заполняем нашу таблицу данными, используя для этого метод Fill() адаптера. Как только мы заполнили данными нашу таблицу, мы можем приступать к чтению данных по каждой записи. Для этого в примере использован цикл foreach в котором мы проходимся по каждой строке таблицы и в каждой строке читаем поля id, name и family каждой записи, используя обобщенный метод Field<T>() , который позволяет привести данные поля к необходимому нам типу.
ИТОГО
Сегодня мы научились выполнять основные операции для работы с базой данный SQLite: создавать соединение с базой данных, создавать новые таблицы, заполнять таблицы данными и считывать данные из таблиц баз данных SQLite. Для того, чтобы запись данных происходила быстрее, мы использовали транзакции, которые позволили ускорить запись в таблицу SQLite более чем на 99%.
1. Создание базы данных
В качестве СУБД выберем программу Microsoft Access. Но вы можете использовать и другую базу данных.
Создаем базу данных в Microsoft Access и называем её «test». В этой базе данных создаем таблицу «contacts»:
Заполните базу данных данными:
Базу данных вы можете и другую создать и данные в ней можете другие добавить т.к. это не принципиально, но мы будем работать с данной таблицей.
2. Создание проекта
В Visual Studio создаём проект:
Открываем список «Выберите источник данных» и нажимаем на ссылку «Добавить источник данных проекта»:
Откроется «Мастер настройки источника данных». В качестве источника выбираем «База данных» и идем далее:
В следующем окне идем далее:
В окне «Выбор подключения к базе данных» нажимаем на «Создать подключение»:
В следующем окне «Добавить подключение» выбираем в «Поставщик OLE DB» Microsoft Office 16.0 Access Database. В «Имя сервера или файла» вписываем путь к нашему файлу базы данных Access (который создали в первом пункте). Проверяем подключение и жмем «ОК»:
Update 2021: Visual Studio 2019 требует файл Access старого формата (.mdb – это старый формат баз данных Access 2002-2003):
В следующем окне идем далее:
Выйдет окно для переноса файла базы данных в Ваш проект нажимаем «Да»:
В следующем окне ничего не меняем и идем далее:
В следующем окне выбираем нашу таблицу «contacts» и жмем «Готово»:
После всех манипуляций наша форма должна быть примерно такой:
Если запустить наш проект, то можно увидать данные из нашей базы данных:
Поменяйте ширину всех столбцов на «150» чтобы столбцы вместились во все окно:
Вот так без единой строчки кода мы вывели данные из нашей таблицы на нужную нам форму. Переходим к 3 пункту.
3. Сохранение данных
Базу данных мы видим, но редактировать её невозможно и именно поэтому нам нужна кнопка «Сохранить». Добавляем на форму кнопку и в свойствах меняем имя на «SaveButton». После добавления кнопки нажимаем на нее два раза и пишем код:
После добавления кода запустите свое приложение и попробуйте изменить любую запись и сохранить.
4. Изменение заголовков столбцов таблицы
Изменим текст столбцов и скроем столбец «img»:
Полезные свойства для изменения столбцов:
- HeaderText – задает название столбца.
- Visible – скрывает заголовок или наоборот.
- Width – ширина столбца.
- Resizable – можно ли изменять ширину столбца.
После того как скроете заголовок «img» измените ширину всех остальных заголовков:
5. Защита от случайного удаления
Чтобы пользователь случайно не удалил запись в нашей базе данных нужно сделать так чтобы перед удалением приложение спрашивало об удалении записи.
Для этого перейдем к компоненту DataGridView, откроем список событий и установим обработчик для события UserDeletingRow. Нажмите два раза на пустую строчку возле события и перейдете к коду. Вписываем код:
После этого проверим работоспособность данного кода. Запустим приложение и попробуем удалить запись. Должно быть вот так:
6. Добавление данных
Добавляем новую форму в проект и называем ее «AddForm»:
Изменяем заголовок формы и добавляем на форму компоненты:
- 1 groupBox c текстом «Добавление записи»;
- 4 TextBox и меняем свойство «Name» на (tbName, tbPhone, tbMail, tbPhoto);
- 4 label и меняем текст на (Имя, Телефон, E-mail, Фото);
- 1 Button и меняем свойство «Name» на «AddBtn» (Добавить);
- 1 Button и меняем свойство «Name» на «CloseBtn» (Закрыть).
Переходим на главную форму и добавляем кнопку «Добавить» для добавления новой записи. Дважды щелкаем на нее и пишем код для вызова нашей новой формы:
Проверьте работоспособность приложения:
Возвращаемся на форму «Добавления записи». Пишем обработчик событий для кнопки «CloseBtn»:
Чтобы обработчик событий на кнопке «AddBtn» работал как надо нужно выполнить несколько действий. Зайти в «Form1.Designer.cs» и изменить модификаторы доступа на «public» нижеуказанных файлов:
- System.Windows.Forms.DataGridView dataGridView1;
- testDataSet testDataSet;
- System.Windows.Forms.BindingSource contactsBindingSource;
- testDataSetTableAdapters.contactsTableAdapter contactsTableAdapter;
Это нужно для того чтобы наша база данных была доступна для разных с ней манипуляций во всех создаваемых нами формах. Обработчик событий для кнопки «AddBtn»:
Проверьте работу приложения. Добавьте несколько новых записей через новую форму добавления записей.
7. Поиск данных
Реализуем самый простой поиск. Данный поиск используется в небольших приложениях. Создаем новую форму с именем «SearchForm» и добавляем на форму компоненты:
- 1 GroupBox (Поиск);
- 1 label;
- 2 button (Найти и Закрыть);
- 1 TextBox и меняем в свойствах «Name» на «tbStr».
Переходим на главную форму и добавляем кнопку «Найти» для поиска записей. Дважды щелкаем на нее и пишем код для вызова нашей новой формы:
Проверяем работоспособность приложения:
Возвращаемся на форму «Поиска». Пишем обработчик событий для кнопки «Закрыть»:
Пишем обработчик событий для кнопки «Найти»:
На главную форму добавляем кнопку «Выход» и пишем для нее код:
Итоговая форма приложения:
Берёмся за дело
Мой же краткий план таков – на первом этапе пишем приложение, которое создаёт базу данных сотрудников и записывает её в формат XML. На втором этапе позаботимся о начальниках, подумав об извлечении информации с использованием различных фильтров. Чтобы немного усложнить конечную задачу, я решил поэкспериментировать с различными подходами – работа с БД напрямую и через коллекции.
В остальном, задача предельно ясна, поэтому можно приступать. Создадим пустой XML файл с требуемой структурой с использованием обыкновенного блокнота:
Заходим непосредственно в Visual Studio и приступаем к самому простому и приятному – созданию нашей формы:
Далее прямо в инициализации формы создадим объекты директории, файла и данных:
Далее привяжем наш XML файл к проекту и загрузим из него данные:
Осталось мелочь – по нажатию кнопки ОК организовать проверку заполнения полей и сохранение данных в созданный файл:
Найдём максимальный ID в нашей таблице, чтобы создать следующий элемент:
Создаем новую строку для нашей таблицы:
И добавляем в неё полученные данные:
Для организации таблицы, извлечём системное время:
Вот, кажется, и всё. Сохраняем данные и перезагружаем файл:
Переходим ко второму этапу. Создаём форму с фильтрами, где поочерёдно структура таблицы будет представлена в формате ListBox-ов. Форма выглядит следующим образом:
Переходим к созданию нашего списка внутри программы. Создаём класс и инициализируем его:
Загружаем данные внутрь программных данных:
Теперь переходим непосредственно к фильтрам. Первый столбец (номинально второй) загружаем полностью.
После чего переходим к фильтрации при обработке изменения выбранного в ListBox:
Послесловие
И далее по аналогии до бесконечности, пока последний запрос не выведет необходимые руководителю поля.
После некоторых доработок и отладок результат был достигнут, а торжественное «Спасибо» - произнесено. Злой рок судьбы теперь каждое утро сталкивает меня и моих коллег с первой частью результатов моего труда и постепенно наводит на размышление, которое я адресую дорогому читателю - а можно ли было сделать лучше и, что самое главное, проще?
Кстати, освоить разработку под Windows можно, обучаясь на профессии «Программист Windows».
Читайте также: