вторник, 29 марта 2011 г.

2-я статья по взаимодействию с СУБД MySQL из программы на С++

 Вывод в консоль

Вывод таблиц в консоли. Интерфейс правда не супер, но для практики думаю хватит.
В коде есть комментарии.

Код:

#define __LCC__ // Объявляем директиву без которой
// программа не может работать. Можно конечно поключить windows.h, 
// но это будет не красиво

#pragma comment(lib, "libmysql_.lib") // подключаем библиотеку
#include "mysql.h" // Заголовочный файл с описание функций
#include "stdio.h"
#include "conio.h"

void mysql(const char query[])
{
 MYSQL mysql; // Дескриптор соединения
 MYSQL_ROW row; // Массив полей текущей строки
 MYSQL_RES *res; // Дескриптор результирующей таблицы

 char host[] = "localhost"; // хост
 char user[] = "admin"; // пользователь
 char passwd[] = "admin"; // пароль
 char db[] = "library"; // название базы данных
 int port = 0; //  порт. Если порт у сервера MySQL не по умолчанию (3306), 
// то нужно указывать конкретный номер порта

 mysql_init(&mysql);  // Инициализация
 mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0); // соединение

 if (mysql_query(&mysql, query) > 0) // запорс. Если ошибок нет, то продолжаем работу
        {
   
   // Если была ошибка, ...
   printf("%s", mysql_error(&mysql));  // ... вывдем ее
   return; // и завершим работу
        } 

    res = mysql_store_result(&mysql); // Берем результат,
    int num_fields = mysql_num_fields(res); // количество полей
    int num_rows = mysql_num_rows(res); // и количество строк.

    for (int i = 0; i < num_fields; i++) // Выводим названия полей
    {
      field = mysql_fetch_field_direct(res, i); // Получение названия текущего поля
      printf("| %s |", field->name);
    }

    printf("\n");
 
    for (int i = 0; i < num_rows; i++) // Вывод таблицы
    {
      row = mysql_fetch_row(res); // получаем строку

      for (int l = 0; l < num_fields; l++)
        printf("| %s |", row[l]); // Выводим поля
  
      printf("\n");
    }
 
    printf("Count records = %d", num_rows); // Вывод информации о количестве записей
   mysql_free_result(res); // Очищаем результаты
 mysql_close(&mysql); // Закрываем соединение
}

int main()
{
  mysql("SELECT * FROM t_mid_author"); // Запрос
  getch(); // Ожидаем нажатие клавиши
  return 0;
}


Графический интерфейс
Очередная статья по взаимодействию с СУБД MySQL из программы на С++

Мутим простейший интерфейс

Кидаем на форму:
TLabel (5 шт.). В свойство Caption пишем хост, порт и т.д.
TEdit (5 шт.). Названия TEdit'ов: hostText, userText, passText, dbText и portText.
TButton (2 шт.). В свойства Caption пишем "Пошел!" и "Закрыть".
TMemo (1 шт.)
TStringGrid (1 шт.)

Подключаем заголовочные файлы, библиотеку и объявим одну константу


Код:

#define __LCC__
#include 
#pragma comment(lib, "libmysql_.lib") // Для Builder 6. см. в первой статье
#pragma comment(lib, "libmysql.lib") // Для MS VC++
// Для других сред программирования не пробовал (
const int buf = 512;
Обработчик кнопки "Закрыть" думаю понятен

А в обработчик копки "Пошел!" пишем следующее

Код:

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

  // Тут Вам все должно быть знакомо
  MYSQL mysql;
  MYSQL_ROW row;
  MYSQL_RES *res;
  MYSQL_FIELD *field;

  /* Объявляем массивы для работы */
  char host[buf];
  char user[buf];
  char passwd[buf];
  char db[buf];
  char query[buf];
  int port = portText->Text.ToInt();
  int num_fields = 0;
  int num_rows = 0;

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

  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;
  }

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

  // Получаем результат
  res = mysql_store_result(&mysql);

  /* Устанавливаем кол-во строк в таблице и сохраняем кол-во строк */
  StringGrid1->RowCount = num_rows = mysql_num_rows(res);

  /* Устанавливаем кол-во полей и сохраняем это кол-во столбцов */
  StringGrid1->ColCount = num_fields = mysql_num_fields(res);
  StringGrid1->FixedRows = 1; // Фиксируем первую строку.

  for (int i = 0; i < num_fields; i++) // Выводим названия полей
  {
   field = mysql_fetch_field_direct(res, i);
   StringGrid1->Cells[i][0] = field->name;// В 1-ю строку
  }

  for (int i = 1; i < num_rows; i++) // Вывод результата запроса
  {
   row = mysql_fetch_row(res); // Получаем строку
   for (int l = 0; l < num_fields; l++)
     StringGrid1->Cells[l][i] = row[l]; // Выводим строку по ячейкам
  }

  mysql_free_result(res); // Освобождаем память
  mysql_close(&mysql); // Закрываем соединение
Вот и все. пишем запрос и "Пошел!".
psycho-coder
(http://programmersforum.ru/showthread.php?t=59147)

Комментариев нет:

Отправить комментарий