понедельник, 4 октября 2010 г.

Установка и работа с MySQL на С++ (MVS,MinGV,Borland)

Установка MySQL 
  1. Качаем последнию версию MySQL Communication Server с сайта: http://www.mysql.com/ 
  2. Качаем MySQL GUI Tools Downloads для работы с БД через GUI. ( При установке MySQL выбираем расширенную установку и ставим галочки в нужном месте, для включения include и lib. )
  3. Ставим GUI Tools
  4. Проверяем что база работает, запустив GUI и сделав коннект к базе. 
  5. Проверяем что созданы директории include и lib в папке куда установлен MySQL
Настройка Microsoft Visual Studio
  1. Необходимо прописать пути к директориям include и lib (Tools->Options->Projects and Solution->VC++ Directories) 
  2. В опциях самого проекта-программы (Project->$Name Property->Configuration Properties->Linker->General) в поле Additional Library Directories прописываем путь к директории lib.
  3. Почти там же (Project->$Name Property->Configuration Properties->Linker->Input) в поле Additional Dependencies пишем libmysql.lib
Все можно запускать пример.

Настройка minGW  Dev++


  1. Вообщем почти также прописываем пути к include и lib в оболочке Dev++ (Параметры компилятора->Директории)
  2. Прописывем библиотеку libmysql.lib в параметрах проекта в разделе параметры->компоновщик.
  3. И если происходит ошибка: "SOCKET чего там не определен", то: Открываем mysql.h и ищем там строку #define my_socket SOCKET и правим так: 
#ifdef __WIN__   
#include <windows.h>
#define my_socket UINT_PTR
//#define my_socket SOCKET 
#else 



windows.h здесь добавился чтобы определился UINT_PTR 


Для Borland (сам не устанавливал, однако, пришлось вникать теоретически)
Вообщем аналогичные действия, однако, добавлется еще один момент.

Т.к. формат lib-ов в borland используется другой (а libmysql.lib сделан изначально под VC)
необходимо сделать libmysql.lib самомтоятельно, имея libmysql.dll и две утилиты из поставки борланда impdef.exe, implib.exe.
Технология должна быть примерно такой:
 
  1. С помощью impdef.exe вытаскиваем из dll - файл с описанием всех ф-ий, например что-то.def.  
  2. Возможно придется поэкперементировать с редактированием файла: что-то.def  (например с добавлением к именам ф-ий '_' или написания строк типа _функция@4=функция, другие варианты написания этого файла есть в инэнте.
  3. С помошью implib.exe и на основе что-то.def генерируем libmysql.lib
Вроде всё. Вероятно будет работать.

Теперь напишем пример на С++:


/* 
  Name:  
  Copyright:  
  Author:Pingi-Pingi  
  Date: 
  Description:  
  This Exemple show: connect, select data, and close  MySQL DataBase. 
  File mysql.h has been changed for normal compilation (Please see comments in  
  mySQL.h from Pingi-Pingi) 
*/ 


#include <cstdlib> 
#include <iostream> 

#include "mysql.h" 

//using namespace std; 
MYSQL mysql; 
MYSQL_ROW row; 
MYSQL_RES *res; 

int main(int argc, char *argv[]) 
{ 
     
    std::cout<<"Start"<<std::endl; 

   MYSQL* mysql = mysql_init((MYSQL*) 0);  
   mysql->free_me = 1;  
   mysql->reconnect = 1;  
   std::cout<<"Connect..."<<std::endl; 
   if (!mysql_real_connect( mysql, "localhost","login","password",NULL, 3306, NULL, 0 )) 
   { 
      std::cout<<"Error code:"<<mysql_errno(mysql)<<" Error:"<<mysql_error(mysql)<<std::endl; 
      mysql_close(mysql); 
      return 0; 
   }    
   std::cout<<"Connected to Data Base!"<<std::endl;  
    
   //Execute Query 
   char *myqery="SELECT * FROM test.table"; 
   if (mysql_query(mysql, myqery))  
   { 
      std::cout<<myqery<<std::endl; 
      std::cout<<"Error code:"<<mysql_errno(mysql)<<" Error:"<<mysql_error(mysql)<<std::endl;       
      mysql_close(mysql) ; 
      return 0; 
   }          


      MYSQL_RES* presults = mysql_store_result(mysql);       
      if (presults) //???? ???? ?????? ? ??????? 
      {                
         MYSQL_ROW row; 
             
         while ((row=mysql_fetch_row(presults))) 
         {                
            std::cout<<row[0]<<","<<row[1]<<","<<row[2]<<std::endl;                
         }  
      } 

    
   mysql_close(mysql) ; 
     
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 


Этот код реализует простые операции с БД, такие как:
connect, select data, and close.

Ниже, несколько расширенный пример, который умеет:
Открыть, Считать данные, Записать, Обновить, Закрыть БД

/*
  Name: 
  Copyright: 
  Author:Pingi-Pingi
  Date: 
  Description: 
  This Exemple show: connect, select data, and close  MySQL DataBase.
  File mysql.h has been changed for normal compilation (Please see      comments in   mySQL.h)
*/

#include <cstdlib>
#include <iostream>
#include "mysql.h"
//using namespace std;

MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES *res;

int main(int argc, char *argv[])
{
    std::cout<<"Start"<<std::endl;

  //Коннектимся к БД

   MYSQL* mysql = mysql_init((MYSQL*) 0); 
   mysql->free_me = 1; 
   mysql->reconnect = 1; 
   std::cout<<"Connect..."<<std::endl;

   if (!mysql_real_connect( mysql, "localhost","myName","myPass",NULL, 3306, NULL, 0 ))
   {
      std::cout<<"Error code:"<<mysql_errno(mysql)<<" Error:"<<mysql_error(mysql)<<std::endl;
      mysql_close(mysql);
      return 0;
   }   
   std::cout<<"Connected to Data Base!"<<std::endl; 
   //Чтение из БД

   std::cout<<"Read From DB..."<<std::endl;
   //Read From BD

   char *myqery="SELECT * FROM test.table";
   if (mysql_query(mysql, myqery)) 
   {
      std::cout<<myqery<<std::endl;
      std::cout<<"Error code:"<<mysql_errno(mysql)<<"Error:"<<mysql_error(mysql)<<std::endl;
      mysql_close(mysql);
      return 0;
   }         

   //Выдаем все что получили на экран
   MYSQL_RES* presults = mysql_store_result(mysql);      
   if (presults) 
   {               
      MYSQL_ROW row;
      while ((row=mysql_fetch_row(presults)))
      {               
          std::cout<<row[0]<<","<<row[1]<<","<<row[2]<<std::endl;               
      } 
   }      
   mysql_free_result(presults); /* освободили */   
   std::cout<<"Read From DB...Done"<<std::endl;    //Вставка в таблицу строки
   std::cout<<"Insert to DB..."<<std::endl;

   char *myqery_insert="INSERT INTO test.table(code,description) VALUES ('122345','This Description')";
   if (mysql_query(mysql, myqery_insert)) 
   {
      std::cout<<myqery<<std::endl;
      std::cout<<"Error code:"<<mysql_errno(mysql)<<"Error:"<<mysql_error(mysql)<<std::endl;      
      mysql_close(mysql);
      return 0;
   }            
   std::cout<<"Insert to DB...Done"<<std::endl;   //Обновление полей
   std::cout<<"Update DB..."<<std::endl;
    
   char *myqery_update="UPDATE test.table SET code='5555', description='This Update Description' where id='3'";
   if (mysql_query(mysql, myqery_update)) 
   {
      std::cout<<myqery<<std::endl;
      std::cout<<"Error code:"<<mysql_errno(mysql)<<"Error:"<<mysql_error(mysql)<<std::endl;
      mysql_close(mysql);
      return 0;
   }   
   std::cout<<"Update DB...Done"<<std::endl;         

   mysql_close(mysql);
   system("PAUSE");
   return EXIT_SUCCESS;
}

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

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