Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2009, 14:22   #11
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Последняя статья по работе с MySQL из программы на С++

Для начала создадим базу банных
Код:
# create.sql
# Создаем базу данных
CREATE database lib;

# Переключаемся на нее
use lib;

# Добавляем пользователя admin с паролем admin и связываем его с базой library
GRANT ALL ON lib.* TO 'admin'@'%' IDENTIFIED BY 'admin';

# Создаем таблицу книги
CREATE TABLE IF NOT EXISTS t_books
(
    ID INT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
    Title CHAR(150) NOT NULL,
	FIO CHAR(150) NOT NULL,
    PRIMARY KEY(ID),
    KEY(Title)
);
Интерфейс формы у меня получился такой (рис.1).

Компоненты:
TLabel и TEdit . по 5 штук, как из предыдущей статьи
ListBox - 1 шт список книг
GroupBox - 1 шт. В нем 2 TLabel и 2 TEdit, название книги и автор
TButton - 5 шт. Их желательно обозвать как у меня (Удалить, Изменить, Добавить, Подключиться, Закрыть).
BitBtn - 1 шт кнопка обновление данных.
TTimer - 1 шт проверка содинения.
Все подробности на скрине.

Объявляем необходимые переменные и подключаем все что нужно...
Код:
#define __LCC__
#pragma comment(lib, "libmysql_.lib")
#include <mysql.h>

const int buf = 512;    // Буфер
bool connected = false; // Есть соединение или нет
int *arrIDs = NULL;     // Массив идентификаторов
int ID = 0;             // Идентификатор текущей книги
MYSQL mysql;            // Дескриптор соединения
MYSQL_RES *res;         // Структура результатов
MYSQL_ROW row;          // Массив строк результата

/* Объявляем массивы для работы */
char host[buf];
char user[buf];
char passwd[buf];
char db[buf];
int port = 0;
Настройки таймера по умолчанию: Выключен и интервал в 5 секунд.
Код обработчика таймера
Код:
  if (mysql_ping(&mysql) > 0)    // Если соединение разорвано...
  {
    connected = false;           // ставим флаг дисконнекта
    if (arrIDs) delete []arrIDs; // Очищаем массив
    Timer1->Enabled = false;     // ... выключаем таймер
    MessageBox(this->Handle, "Соединение с сервером потеряно", "Ошибка!",
      MB_OK | MB_ICONERROR);     // Выведем сообщение лоб этом
    Button5->Click();            // Запустим повторное соединение
  }
Далее обработчики кнопок

Код кнопки "Подключиться"
Код:
// Подключение
  if (connected) return; // Если уже соединены, то выходим.
  /* Проверим, что все данные были введены */
  if (hostText->Text.IsEmpty() || userText->Text.IsEmpty() ||
      passText->Text.IsEmpty() || dbText->Text.IsEmpty() ||
      portText->Text.IsEmpty())
  {
    MessageBox(this->Handle, "Не все поля заполнены!", "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  /* Инициализируем имя хоста, пользователя, пароль, порт и БД */
  strcpy(host, hostText->Text.c_str());
  strcpy(user, userText->Text.c_str());
  strcpy(db, dbText->Text.c_str());
  strcpy(passwd, passText->Text.c_str());
  port = portText->Text.ToInt();

  mysql_init(&mysql); // Инициализация
  if (!mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0))
  { /* Пробуем подключиться, если кде-то ошибка, то сообщим об этом */
    MessageBox(this->Handle, mysql_error(&mysql), "Error!",
      MB_OK | MB_ICONERROR);
    return;
  }

  connected = true;       // Соединены
  Timer1->Enabled = true; // Порверка соединения каждые 5 сек.
  BitBtn1->Click();
Код кнопки "Обновить" (BitBtn1)
Код:
  // Обновление списка книг
  if (!connected) return; // Если соединения нет, то выходим

  /* Так как, мы знаем что нам нужно, то и запрос будет статическим.
     Получим названия всех книг и идентификаторов, потом заполним ими ListBox
     Сортируем в порядке возрастания по названию книги */
  if (mysql_query(&mysql, "SELECT ID, Title FROM t_books ORDER BY Title") > 0)
  { // Проверка на ошибки
    MessageBox(this->Handle, mysql_error(&mysql), "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  ListBox1->Clear(); // Очистка списка.
  if (arrIDs) delete []arrIDs;

  // Заполняем структуру
  res = mysql_store_result(&mysql);
  // Получаем количество записей
  int count = mysql_num_rows(res);
  arrIDs = new int[count];

  for (int i = 0; i < count; i++)
  {
    // Полчаем строку
    row = mysql_fetch_row(res);
    // Заполняем массив 
    arrIDs[i] = StrToInt(row[0]);
    // Добавляем в ListBox название книги
    ListBox1->Items->Add(row[1]);
  }

  mysql_free_result(res); // Освобождаем ресурсы
Изображения
Тип файла: jpg рис.1.jpg (27.9 Кб, 2677 просмотров)

Последний раз редактировалось psycho-coder; 22.07.2009 в 16:31.
psycho-coder вне форума Ответить с цитированием
Старый 22.07.2009, 14:22   #12
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код кнопки "Добавить"
Код:
  // Добавление книг
  // Если соединения нет или поля ввода пустые, то выходим
  if (!connected && (bookText->Text.IsEmpty() || authorText->Text.IsEmpty()))
    return;

  // Формируем запрос на добавление книги
  AnsiString tmp = "INSERT INTO t_books (ID, Title, FIO) VALUES (NULL,\
    '" + bookText->Text + "', '" + authorText->Text + "')";

  char query[buf]; // Переменная дла запроса
  strcpy(query, tmp.c_str()); // Ковертируем в нужный формат.

  // Запрос. Если ошибки есть, то выводим их и выходим из функции
  if (mysql_query(&mysql, query) > 0)
  {
    MessageBox(this->Handle, mysql_error(&mysql), "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  // Вывод сообщения о том, что все хорошо.
  MessageBox(this->Handle, "Книга добавлена!", "", MB_OK | MB_ICONINFORMATION);
  bookText->Clear();
  authorText->Clear();
  BitBtn1->Click(); // Обновим данные
Код кнопки "Изменить"
Код:
  // Изменение книг
  // Если соединения нет и книга не выбрана, то выходим
  if (!connected && ID < 1) return;

  AnsiString tmp = "UPDATE t_books SET Title = '" + bookText->Text +"',\
    FIO = '" + authorText->Text + "' WHERE ID = " + IntToStr(ID);

  char query[buf];
  strcpy(query, tmp.c_str());

  if (mysql_query(&mysql, query) > 0)
  {
    MessageBox(this->Handle, mysql_error(&mysql), "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  MessageBox(this->Handle, "Информация о книге обновлена", "",
    MB_OK | MB_ICONINFORMATION);
Код кнопки "Удалить"
Код:
  // Удаление книг
  // Если соединения нет и нет выделенной книги для удаления, то выходим
  if (!connected && ID < 1) return;

  // Подтверждение удаления
  if (MessageBox(this->Handle, "Удалить?", "Удаление",
    MB_YESNO | MB_ICONQUESTION) != 6) return;

  // Формируем запрос на удаление
  AnsiString tmp = "DELETE FROM t_books WHERE ID = " + IntToStr(ID);
  char query[buf];
  // Приводим его
  strcpy(query, tmp.c_str());

  // Выполняем.
  if (mysql_query(&mysql, query) > 0)
  {
    MessageBox(this->Handle, mysql_error(&mysql), "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  MessageBox(this->Handle, "Книга удалена", "", MB_OK | MB_ICONINFORMATION);
  BitBtn1->Click();
Выбор книги из ListBox будет производится по двойному щелчку
Код:
  // Выбор книги
  // Если соединения нет, то выходим
  if (!connected) return;

  // Тут надеюсь все понятно. Если нет, смотрите "Обновление списка"
  AnsiString tmp = "SELECT FIO FROM t_books WHERE ID = "
    + IntToStr(arrIDs[ListBox1->ItemIndex]);
    
  char query[buf];
  strcpy(query, tmp.c_str());

  if (mysql_query(&mysql, query) > 0)
  {
    MessageBox(this->Handle, mysql_error(&mysql), "Ошибка!",
      MB_OK | MB_ICONERROR);
    return;
  }

  // Получаем результаты
  res = mysql_store_result(&mysql);
  row = mysql_fetch_row(res);
  
  // Получаем идентификатор книги
  ID = arrIDs[ListBox1->ItemIndex];

  // Выводим название книги
  bookText->Text = ListBox1->Items->Strings[ListBox1->ItemIndex];
  // Выводим автора
  authorText->Text = row[0];
  mysql_free_result(res);
И по закрытию программы написать
Код:
  // Закрытие программы
  // Если соединены, то разрываем соединение.
  if (connected)
  {
    mysql_close(&mysql);
    if (arrIDs) delete []arrIDs;
  }
В аттаче все исходники статей (кроме первой) и скрипт sql
Вложения
Тип файла: rar mysql.rar (14.8 Кб, 445 просмотров)

Последний раз редактировалось psycho-coder; 22.07.2009 в 16:34.
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mysql в С++ Ted Общие вопросы C/C++ 3 23.07.2009 14:10
MySQL unicode Софт 6 11.07.2009 00:11
MySQL silexz SQL, базы данных 1 21.04.2009 16:33
Mysql бд krasava SQL, базы данных 1 19.04.2009 14:54
MySQL нужна библ. для Visual C++ (MySql++) Alexoid Visual C++ 8 07.05.2008 18:29