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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2009, 21:11   #1
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию MySQL и C++

Здравствуйте! Извените пожалуйста за может быть несколько по дилетантски поставленный вопрос но может кто подскажет как связать MySQL и C++ ну что бы считать оттуда данные!!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 18.07.2009, 21:25   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Например вот так

Код:
#include <stdio.h>
#include <mysql.h>

void mysql()
{
	MYSQL mysql;
	MYSQL_ROW row;
	MYSQL_RES *res;
	
	char host[] = "loclahost";
	char user[] = "user";
	char passwd[] = "passwd";
	char db[] = "database";
	int port;
	cahr *tmp = "";
	
	mysql_init(&mysql);
	mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0);
	
	mysql_query(&mysql, "SELECT * FROM table");
	tmp = mysql_error(&mysql);
	
	if (tmp == "")
	{
		res = mysql_store_result(&mysql);
		count = mysql_num_fields(res);
		int l = 0;
		while (row = mysql_fetch_row(res))
		{
			for (int i=0; i<count; i++)
				printf("%d	|	%d", row[i]);
			i++;
		};
	}
	else
	{
		printf("%s", tmp);
	}
	
	mysql_free_result(res);
	mysql_close(&mysql);
	
}

int main()
{
      mysql();
      return 0;
}
На работоспособность не проверял. Не могу щас((

Последний раз редактировалось psycho-coder; 18.07.2009 в 21:28.
psycho-coder вне форума Ответить с цитированием
Старый 18.07.2009, 21:33   #3
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Спасибо!!!! За помощь!сейчас посмотрю!! Должен понять!!!!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 18.07.2009, 22:07   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Вот пример для VC++ WinForms.
Мой MySQL Client. Он правда еще сырой, но принцип понять можно
Вложения
Тип файла: rar Form1.rar (4.1 Кб, 52 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 20.07.2009, 13:46   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Итак. Вот небольшая статья по взаимодействию с СУБД MySQL из программы на C++

Для работы в Builder 6 необходимо конвертировать Libmysql.lib.
Для этого, нужно открыть консоль и набрать там это

Код:
C:\>"C:\Program Files\Borland\CBuilder6\Bin\coff2omf.exe" 
-lib:st "C:\Program Files\Borland\CBuilder6\Lib\libmysql.lib" 
"C:\Program Files\Borland\CBuilder6\Lib\libmysql_.lib"
У каждого пути будут свои. В аттаче все либы, на всякий случай.
Также в папке с программой должны быть libmysql_.lib и libmysql.dll
В среде MS VC++ можно использовать библиотеку без конвертации, т.е. libmysql.lib.
Закидываем все заголовочные файлы от MySQL (include.rar) в "$(CBUilder6)\include", или в папку с программой, но тогда нужно подключать их локально.

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

#pragma comment(lib, "libmysql_.lib") // подключаем либу
#include <mysql.h> 
#include <stdio.h>
#include <conio.h>


void mysql()
{
        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, "SELECT * FROM t_mid_author WHERE ID=2") > 0) // запорс. Если ошибок нет, то ...
        {
               // Если была ошибка, ...
	       printf("%s", mysql_error(&mysql)); // проверка на ошибки
               return;
        } 


	res = mysql_store_result(&mysql); // Получаем дескриптор на результирующую таблицу

        row = mysql_fetch_row(res); // Заполняем строку
        printf("ID=%c, L_author=%c, L_book=%c", *row[0], *row[1], *row[2]); // Вывод данных
        mysql_free_result(res); // Освобождаем данные
	mysql_close(&mysql); // закрываем соединение
}

int main()
{
  mysql();
  getch();
  return 0;
}
Код исправил

В данном примере после выполнения запроса в row загружается массив полей, т.к. результат у нас один (об этом говорит условие WHERE ID=2), то можно вывести без цикла. Таким образом в row[0] будет первое поле из таблицы, в row[1] - второе и т.д. Результат на скрине. Вечером выложу пример с циклом. Вывод таблиц.

Удачи!
Изображения
Тип файла: jpg mysql.jpg (37.1 Кб, 186 просмотров)
Вложения
Тип файла: rar include.rar (73.7 Кб, 671 просмотров)
Тип файла: rar libmySQL.dll.rar (446.3 Кб, 614 просмотров)
Тип файла: rar libmysql.lib.rar (5.1 Кб, 599 просмотров)
Тип файла: rar libmysql_.lib.rar (2.5 Кб, 577 просмотров)

Последний раз редактировалось psycho-coder; 20.07.2009 в 16:45.
psycho-coder вне форума Ответить с цитированием
Старый 20.07.2009, 20:17   #6
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Вот Спасибооооооооооооооо
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 20.07.2009, 22:29   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Не буду плодить темы, а продолжу в этой ветке.

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

Код:
#define __LCC__

#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; // Дескриптор результирующей таблицы
        MYSQL_FIELD *field; // Структура содержащая инфу о полях

	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;
}
P.S. В следующей статье мы переедем в GUI.
psycho-coder вне форума Ответить с цитированием
Старый 21.07.2009, 14:03   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию [MySQL] + [C++ + GUI

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

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

Подключаем заголовочные файлы, библиотеку и объявим одну константу
Код:
#define __LCC__
#include <mysql.h>
#pragma comment(lib, "libmysql_.lib") // Для Builder 6. Подробней см. в первой статье
#pragma comment(lib, "libmysql.lib") // Для MS VC++
// Для других сред программирования не пробовал (
const int buf = 512;
Далее, в обработчик кнопки "Закрыть" пишем
Код:
Close();
А в обработчик копки "Пошел!", следующее

Код:
/* Проверим что все данные были введены? в.ч. и сам запос (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; // В первую строку, которую мы зафиксировали
  }

  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); // Закрываем соединение
Вот и все. пишем запрос и "Пошел!".

Есть замечания для VC++ WinForms.
Для конвертирования из String^ в char[] можно использовать следующие функции
Код:
private: String^ ToUCS2(const char* utf8)
{
     try
     {
	return gcnew String(utf8, 0, strlen(utf8), System::Text::Encoding::Default);
     }
     catch(...)
     {
	return "";
     }
}
private: Void ToUTF8(char* pcOut, int nOutLen, String^ sIn)
{
    try
    {
	 array<Byte>^ bytes = System::Text::Encoding::Default->GetBytes(sIn);
	 nOutLen = Math::Min(nOutLen - 1, bytes->Length);
	 System::Runtime::InteropServices::Marshal::Copy(bytes, 0, IntPtr(pcOut), nOutLen);
	 pcOut[nOutLen] = '\0';
    }
    catch (...)
    {
	 pcOut[nOutLen] = '\0';
    }
}
Пример использования
Код:
const int buf = 512;
char host[buf];
ToUTF(host, buf, hostText->Text); // Перевод из String^ в char[]
String ^tmp = ToUCS(mysql_error(&mysql)); // Перевод из char* в String^
Изображения
Тип файла: jpg рис.1.jpg (24.7 Кб, 153 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 21.07.2009, 14:09   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию [MySQL] + [C++] + [GUI]

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

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

Подключаем заголовочные файлы, библиотеку и объявим одну константу
Код:
#define __LCC__
#include <mysql.h>
#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; // В первую строку, которую мы зафиксировали
  }

  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); // Закрываем соединение
Вот и все. пишем запрос и "Пошел!".

Есть замечания для VC++ WinForms.
Так как типы String^ и char[] несовместимы, то для конвертирования из String^ в char[] можно использовать следующие функции:
Код:
private: String^ ToUCS2(const char* utf8)
{
     try
     {
	return gcnew String(utf8, 0, strlen(utf8), System::Text::Encoding::Default);
     }
     catch(...)
     {
	return "";
     }
}
private: Void ToUTF8(char* pcOut, int nOutLen, String^ sIn)
{
    try
    {
	 array<Byte>^ bytes = System::Text::Encoding::Default->GetBytes(sIn);
	 nOutLen = Math::Min(nOutLen - 1, bytes->Length);
	 System::Runtime::InteropServices::Marshal::Copy(bytes, 0, IntPtr(pcOut), nOutLen);
	 pcOut[nOutLen] = '\0';
    }
    catch (...)
    {
	 pcOut[nOutLen] = '\0';
    }
}
Пример использования
Код:
const int buf = 512;
char host[buf];
ToUTF8(host, buf, hostText->Text); // Перевод из String^ в char[]
String ^tmp = ToUCS2(mysql_error(&mysql)); // Перевод из char* в String^
В следующей статье, мы рассмотрим еще один вариант использования GUI, но уже более специфичный метод. И напишем небольшой клиент к базе данных "Библиотека".

Удачи!
Изображения
Тип файла: jpg рис.1.jpg (24.7 Кб, 2693 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 22.07.2009, 10:48   #10
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Спасибо огромное!!! я дам знать когда получица!!!! или если будут вопросы!!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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