Итак :-) Ниже будет пост, бьющий все рекорды просмотров на codepaste. В свое время я почему-то ничего толкового не нашел, было много экспериментов. Теперь я хочу показать тебе маленький, но очень гордый проект для работы с БД MySQL
Предисловие и приготовления
Итак, значит, дошли мы до серьезного приложения, где необходимо использовать полноценную БД?) Ок. Подготовка состоит из следующих этапов:
- Скачивание и установка MySQL-сервера (если приложение работает с локальной базой)
- Конфигурация графического интерфейса БД (phpMyAdmin - веб-морда, пригодится, если помимо MySQL-сервера у нас стоит еще и http-сервер(Apache, например). Так будет, если вы берете MySQL из состава Denwer. Иначе, если тебя интересует только БАЗА, то рекомендую dbForge Studio for MySQL)
- Конфигурация базы (собственно, описание ее структуры, связей, типов, состава полей и т.п...) или перенос дампа с существующей базы
- Написание программы-клиента.
О компоновке проекта можно почитать здесь
Реализация
Ок, все вводые выполнили, теперь можно приступать. Извращаться не будем, для наглядности пишем в одном файле. Сначала ничего интересного - описываем подключаемые библиотеки, файлы и пространства имен:
// Указываем статическую библиотеку mysql #pragma comment(lib, "C:\Program Files\MySQL\MySQL Server 5.0\lib\debug\libmysql.lib") // Пригодится в программе далее #include <iostream> #include <cstring> // Файлы с интерфейсами mysql #include <my_global.h> #include <mysql.h> using namespace std;
А вот теперь заполняем основные константы для подключения к базе и переходим к телу функции main. (Знатоков PHP сейчас начнет хватать за пятку де-жа-вю)
// Зададим глобальные константы, которые понадобятся при подключении
// Хост, где стоит MySQL (имя компьютера в сети / IP-адрес и т.п.),
// в нашем случае - наш локальный компьютер
const char Host[] ={"localhost"};
// Имя пользователя MySQL, пусть будет root
const char User[] = {"root"};
// Пароль пользователя (ВНИМАНИЕ! Для Denwer и, если доступ к
// базе настроен без пароля, указывать
// вместо него в функции соединения 0 (без ковычек))
const char Pass[] = {"123"};
// Имя базы данных, с которой будем работать
const char DBase[] = {"Base_primer"};
// Начало функции main
int main()
{
// Научим консоль понимать кириллицу (кодировка cp1251,
// которую мы, кстати, должны были указать при установки БД)
setlocale (LC_ALL,".1251");
/* Указатель на соединение (дескриптор). Мы можем открывать много соединений,
а он будет своего рода идентификатором конкретного соединения для операции.*/
MYSQL *link;
// Инициализация нового подключения. Учи как китайскую грамоту.
link = mysql_init(0);
// Подключение к БД
mysql_real_connect(link,Host,User,Pass,DBase,0,0,0);
MYSQL_RES *result = 0; // Указатель на результат запроса
MYSQL_ROW row; // Переменная, из которой будем читать результат
mysql_query(link, "SET NAMES 'cp1251'"); // Задаем кодировку соединения
Итак, обращу твое внимание. Мы подключились к базе, уже без палева провели первый запрос. Да. Это функция mysql_query(дескриптор,"Запрос");. В данном случае, мы подключились и сказали:"Дорогая База Данных! Пожалуйста, сформируй кодировку вывода для соединения link как кириллическую (cp1251)". Тем самым мы, консоль и база говорят на одном языке (кодировке). Теперь можем смело приступать к более осмысленным вещам.
Пусть у тебя есть некая таблица со статьями (articles), в ней есть поля автор (Authors) и название стати (Title). Попробуем "вытащить" из базы названия всех статей, автор которых, к примеру...Хватит это терпеть! Пусть будет Жириновский.
// Напишем строку запроса
// Обратите внимание на использование "прямых" и "косых" одиночных ковычек
string query = "SELECT `Title` FROM `articles` WHERE `Authors`='Жириновский'";
// Теперь сделаем запрос к базе функцией
// mysql_query(указатель_соединения, запрос)
mysql_query(link,query.c_str());
// Извлечение результатов запроса
result = mysql_store_result(link);
// Если у нас база нашла хотя бы одну подходящую запись...
if(mysql_num_rows(result) > 0)
{
/*
"Расшифровываем" результат запроса в row (это массив строк,
в которых каждый элемент - запрашиваемый параметр, у нас он
только один, так как мы выбирали только 'Title')
*/
while (row = mysql_fetch_row(result))
{
/*
Выведем в цикле в консоль первую запись из всех найденых
строк (она единственная, т.к. мы выбрали только 'Title')
*/
cout << row[0] << endl;
}
}
else
{
cout << "Не найдено ни одной статьи этого автора";
}
// После использования результата
// обязательно освободи ресурсы перед следующим запросом!
mysql_free_result(result);
mysql_close(link); // Закрываем соединение
system("PAUSE");
return 0;
}
Это не безопасный вариант кода, если у нас какая-то операция не удастся, то программа вылетит с ошибкой. Давай еще раз то же самое, но с проверкой на успешность.
#pragma comment(lib, "C:\Program Files\MySQL\MySQL Server 5.0\lib\debug\libmysql.lib")
#include <iostream>
#include <cstring>
#include <my_global.h>
#include <mysql.h>
using namespace std;
const char Host[] ={"localhost"};
const char User[] = {"root"};
const char Pass[] = {"123"};
const char DBase[] = {"Base_primer"};
int main()
{
setlocale (LC_ALL,".1251");
MYSQL *link;
link = mysql_init(0);
if (!link)
{
cout << "Невозможно получить дескриптор подключения к базе данных!"<<endl;
system("PAUSE");
return 1;
}
// Соединение
if (!mysql_real_connect(link,Host,User,Pass,DBase,0,0,0))
{
cout << "Невозможно подключиться к базе данных!"<< endl;
system("PAUSE");
return 1;
}
MYSQL_RES *result = 0;
MYSQL_ROW row;
string query = "SELECT `Title` FROM `articles` WHERE `Authors`='Жириновский'";
cout << query << endl;
// Проведение запроса
// Обратите внимание, когда все хорошо - возврашает 0
if(mysql_query(link, "SET NAMES 'cp1251'") != 0)
{
cout << "Невозможно провести запрос!" << endl;
mysql_close(link);
system("PAUSE");
return 1;
}
if ( mysql_query(link,query.c_str()) )
// c_str() для string возвращает char-строку
{
cout << "Невозможно провести запрос!" << endl;
mysql_close(link);
system("PAUSE");
return 1;
}
// Извлечение результата
result = mysql_store_result(link);
if (!result)
{
cout << "Извлечение результатов запроса завершилось аварийно!" < 0)
{
while (row = mysql_fetch_row(result))
{
cout << row[0] << endl;
}
}
else
{
cout << "Не найдено ни одной статьи этого автора" << endl;
}
// Закрытие соединения
mysql_close(link);
system("PAUSE");
return 0;
}
Постскриптум
Функций, доступных разработчикам, много. Мануалы по конкретным задачам гуглятся на ура. Я же ставил себе целью показать некий "Hello, World!", маленький, но уже обросший всем необходимым, 100% рабочий проект.
Здравствуйте, подскажите пожалуйста, а как можно создать базу данных в самой программе? Просто здесь в примере сразу подключение к БД, а есть ли возможность именно создать её?
ОтветитьУдалить