2010년 1월 20일 수요일

21.5.6. MySQL Connector/C++ Tutorials

Here are some tutorials on using MySQL Connector/C++. You should also have a look at the examples which can be found in the following section Section 21.5.5, “MySQL Connector/C++ Getting Started: Usage Examples”.
Setting up the World database for use in the tutorials
These tutorials primarily use the World database, so you need to have that installed. You can download the World database, and documentation on how to install it, from the MySQL Documentation page - look for the section called “Example Databases”.
Tutorial framework code
Rather than repeating the same code, a framework is given here. You can reuse this framework with all the tutorials unless otherwise stated. This boiler plate code can then simply be reused for each tutorial.
The framework code is given here:
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
 
#include "mysql_connection.h"
 
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
 
#define EXAMPLE_HOST "localhost"
#define EXAMPLE_USER "root"
#define EXAMPLE_PASS ""
#define EXAMPLE_DB "world"
 
using namespace std;
 
int main(int argc, const char **argv)
{ 

    string url(argc >= 2 ? argv[1] : EXAMPLE_HOST);
    const string user(argc >= 3 ? argv[2] : EXAMPLE_USER);
    const string pass(argc >= 4 ? argv[3] : EXAMPLE_PASS);
    const string database(argc >= 5 ? argv[4] : EXAMPLE_DB);

    cout << "Connector/C++ tutorial framework..." << endl;
    cout << endl;

 
    try {
 
 /* INSERT TUTORIAL CODE HERE! */
 
    } catch (sql::SQLException &e) {
        /*
          The MySQL Connector/C++ throws three different exceptions:
 
          - sql::MethodNotImplementedException (derived from sql::SQLException)
          - sql::InvalidArgumentException (derived from sql::SQLException)
          - sql::SQLException (derived from std::runtime_error)
        */
        cout << "# ERR: SQLException in " << __FILE__;
        cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
        /* Use what() (derived from std::runtime_error) to fetch the error message */
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
 
        return EXIT_FAILURE;
    }
 
    cout << "Done." << endl;
    return EXIT_SUCCESS;
}

To compile and run the framework
First, copy and paste the framework code to a file such as frmwk.cpp. Edit the #define statements to reflect your connection details (server, user, password, database).
To compile the framework, for example on Mac OS X, type:
shell> g++ -o frmwk -I/usr/local/include -I/usr/local/include/cppconn -lmysqlcppconn frmwk.cpp
To run the framework, enter the following:
shell> ./frmwk
You will see a simple message. You are now ready to continue to the tutorials.

MySql 구조도 및 명령어

SQL 구조도






















DATABASE –>여러 개의 TABLE -> 여러 개의 필드;
명령어들


-DATABASES-
*SHOW  DATABASES;                                         <현재 있는 데이터 베이스 이름을 본다.>
*USE  데이터베이스이름;                                 <데이터베이스이름를 사용한다.>
*CREATE  DATABASE 데이터베이스이름;      <데이터베이스이름으로 데이터베이스를 만듬.>
*DROP  DATABASE 데이터베이스이름;           <데이터베이스이름의 데이터베이스를 삭제>


-DATABASE- :USE 데이터베이스이름; 명령으로 사용할 데이터베이스 선택해야함
*CREATE  TABLE 테이블이름(구조)               <데이터베이스안에 테이블를 만든다.>
Ex) CREATE TABLE aa(id INT AUTO_INCREMENT, name VARCHAR(30), old INT, exp INT, PRIMARY KEY(id));
-> 변수 선언할 때 (변수이름 변수형, ….. )
-> AUTO_INCREMENT 자동추가로 값을 입력할 때 NULL를 넣으면 자동 증가된다.
-> PRIMARY KEY(id) 명령은 테이블 내의 특정 변수를 검색하는데 있어서 데이터베이스를
최적화 하는데 사용된다. 뒤에 in는 가장 처음 선언한 변수로써 id를
가장 많이 검색하게 될 것이므로 id를 테이블의 primary key로 설정했다..


*SHOW  TABLES;                                      <데이터베이스안에 선언한 테이블 이름이 출력.>
*DECRIBE  테이블이름;                                         <데이터베이스안의 테이블이름의 구조를 본다.>
Ex) DECRIBE aa; 라고 하면 aa라는 테이블 구조가 출력된다.
*INSERT INTO 테이블이름 VALUES (테이블 변수값);
Ex) INSERT INTO aa VALUES (NULL, ‘잭’, 14, 1431), (NULL, ‘룬’, 20, 14342) ;
 ->문자열 입력할때는 ‘룬’ 처럼 ‘ ‘ 안에 넣도록


*DROP  TABLE  aa;
데이터베이스 안의 aa 데이블 자체를 지운다.
<SELECT 테이블 데이타 검색>
*SELECT  *  FROM  테이블이름             <데이터베이스안의 테이블이름 모든 내용 값출력.>
*SELECT  찾는테이블변수이름  FROM  테이블이름   
                                            <데이터베이스안의 검색테이블변수이름에 대한 모든 값을 출력>
Ex) SELECT name,exp FROM aa;                              aa테이블 안의 name과 exp 부분값만 출력
*SELECT  *  FROM  테이블이름  WHERE 조건;       테이블안에 조건에 맞는 필드만 출력
Ex) SELECT *FROM aa WHERE exp > 1000;               aa테이블 안의 exp부분값이 1000이상일것만 출력
확장 => SELECT id,name FROM aa WHERE old = 86;   aa테이블 안의 old값이 86인것만 id과 name를 출력
          => SELECT * FROM aa WHERE old > 86 AND old<20;  AND 명령어로 조건을 추가할 수 있다.
*SELECT * FROM aa WHERE name LIKE “J%”;   <aa테이블의 name내용중 “J”로 시작하는 필드들 출력
 =>LIKE는 부분 속하는것이다. 만약 LIKE “%S%” 로 검색하면 S문자가 포함된 모든 값들을 출력한다.


* SELECT * FROM aa WHERE name LIKE “J%” LIMIT 2;                            =제한.
<aa테이블의 name내용중 “J”로 시작하는 필드를 출력하는데 2개만 출력한다.>


<DELETE FROM 테이블에 필드 삭제. >
*DELETE FROM aa WHERE name = “Jeff”;
<aa테이블에서 이름이 Jeff인 필드를 삭제한다>
*DELETE FROM aa;
<aa테이블 안의 모든 필드를 지운다.>


<ALTER 테이블에 다른 필드 추가. >
*ALTER  TABLE  aa  ADD  lastTime  TIMESTAMP;  
<aa의 테이블안에 lastTime라는 이름에 TIMESTAMP 속성의 필드가 추가된다.>
즉 aa가 (id INT, name VARCHAR(30), old INT, exp INT); 였다면
위 명령실행후
Aa는 (id INT, name VARCHAR(30), old INT, exp INT, lastTime TIMESTAMP) 로 된다는 것이다.


*ALTER  TABLE  aa  MODIFY  name  VARCHAR(50);
<aa의 테이블 안에 있는 name 변수를 VARCHAR(50)으로 속성을 바꾼다.>


<UPDATE 필드의 데이터 업데이트>
*UPDATA aa SET lasttime =NULL WHERE name = “Jeff”;
<aa의 테이블 안에 있는 name이 “Jeff”이 lasttime 속성의 값을 현재시간으로 업데이트한다.>
(TIMESTAMP는 NULL입력하면 현재시간으로 된다.)>
(만약 직접 입력하고 싶다면 NULL대신 20090722002000 처럼 입력하면된다. 앞에서부터 2009년 07월 22일 00시 20분 00초 이다,)
확장 => 마지막에 LIKE 명령어로 해당 값이 들어간 모든 것에 수정할수 있다.
           *UPDATA aa SET lasttime =NULL WHERE name LIKE “J%”;
           ->이름이 J시작하는 lasttime를 현재시간으로 업데이트한다.


<ORDER BY 출력 순서 정하기 > -기본이 오름차순이다.
*SELECT * FROM aa ORDER BY name;         <aa테이블에서 name를 값중심으로 오름차순 정렬한다>
내림차순으로하려면 => *SELECT * FROM aa ORDER BY name DESC;      
같은값이 나올 때 또다른 순서 => (ex) old 나이가 같은사람은 다음 경험치로 순서를 정하려면)
                                            *SELECT * FROM aa ORDER BY old,exp;


<마지막 입력된데이터 구하기
1. SELECT @maxid:=MAX(id) FROM aa;
 - @명령어로 maxid 이름을 변수를 선언하여 id필드로부터 가장 큰 값을 얻어 저장한다.
2. SELECT *FROM aa WHERE id = @maxid;
 - 테이블 aa에서 id값이 maxid에 저장되 최대값인 필드만 출력한다.


*가장 늦은 시간값 구하는 방법
1. 마지막 시간을 가져온다.
 SELECT @lastTime:=MAX(lastTime) FROM aa;
2.그 시간을 가지고 검색해서 가져온다.
 SELECT * FROM aa WHERE lastTime =@lastTime;
이때 같은 이름을 했지만 지역 변수로 되어 중복되는 것이 아니다.


-기타.
*DB 백업하기 backup.sql 파일 만들기
콘솔화면에서 mysqldump 파일 있는 경로로 가서(보통 sql이 설치된  bin에 있다)
Mysqldump –u root –p DB데이타 이름 > 저장이름.sql
Ex) Mysqldump –u root –p gamedata > gamedata.sql


*gamedata.sql 파일 복원
컨솔화면에서 mysql –u root 넣을데이타베이스이름 < 넣을데이타.sql;
Ex) mysql –u root gamedata <gamedata.sql
중요한건 넣기전에 새로운DB가 없으면 안되니. CREATE DATABASE gamedata; 만들어줄것!





MySql C API Table 과 Record : 추가 삭제 데이터 입력 레코드 찾기

#define SQL_CREATE                                 "CREATE"

#define SQL_DROP                                    "DROP"



#define SQL_TABLE                                   "TABLE"

#define SQL_DATABASE                            "DATABASE"



////#define SQL_INSERT_RECORD "INSERT INTO playerinfo VALUES(NULL , %s, %d);" //"



#define SQL_INSERT                               "INSERT"

#define SQL_INTO                                   "INTO"

#define SQL_VALUES                              "VALUES"



//#define SQL_SELECT_RECORD "SELECT * FROM playerinfo"

#define SQL_SELECT                              "SELECT"

#define  SQL_FROM                                "FROM"

#define SQL_WHERE                              "WHERE"



//---------Table----------------------------------

//------------------------------------------------

//테이블리스트를가져온다

BOOL CMySQLDB::GetTableList(MYSQL_RES*  &Refresul)

{

             MYSQL_RES*  result =NULL;



             result= mysql_list_tables(m_DBInfo.m_MySQL_CONNECT,"%");

             Refresul=result;

             if(result)

             {

                           while(result->data->data!=NULL){

                                        printf("있다%s\n",*(result->data->data->data));

                                        result->data->data =result->data->data->next;

                           }

                           return TRUE;

             }

            

             return FALSE;

}

//테이블생성

BOOL CMySQLDB::CreateTable(const char* TableName,const char* TableStructure)            

{

             if(!TableName || !TableStructure )

                           return FALSE;



             memset(m_CommandString,0, _countof(m_CommandString));

             sprintf_s(m_CommandString,"%s %s %s(%s); ",SQL_CREATE,SQL_TABLE, TableName,TableStructure);

             m_dQuery_stat=mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);

             if (m_dQuery_stat != 0)

             {

                           cout<<"여기?"<<endl;

                           //fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));

                           return FALSE;

             }

             cout<<m_CommandString<<endl;





             return TRUE;

}





//테이블삭제

BOOL CMySQLDB::DelTable(const char* Tablename)

{

             if(!Tablename)

                           return FALSE;



             memset(m_CommandString,0, _countof(m_CommandString));

             sprintf_s(m_CommandString,"%s %s %s",SQL_DROP,SQL_TABLE, Tablename);

             cout<<m_CommandString<<endl;



             m_dQuery_stat=mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);

             if (m_dQuery_stat != 0)

             {

                           return FALSE;

             }

             /*

             query_stat=mysql_query(connection,SQL_DROP_TABLE);

             if (query_stat != 0)

             {

             fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));

            

             }

*/



             return TRUE;

}



//---------Record----------------------------------

//------------------------------------------------

//레코드삽입.

BOOL CMySQLDB::INSERTTableValue(const char* TableName,const char *valse , ...  )

{

             if(!TableName || !valse )

                           return FALSE;

            

             //레코드에입력값들을스크림으로만든다.

             char ValueString[512];

             va_list argptr;

             va_start( argptr, valse );

             vsprintf_s(ValueString, valse, argptr );

             va_end( argptr );



             memset(m_CommandString,0, _countof(m_CommandString));

             sprintf_s(m_CommandString,"%s %s %s %s(%s);",SQL_INSERT,SQL_INTO, TableName,SQL_VALUES,ValueString);



             m_dQuery_stat = mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);





             if (m_dQuery_stat != 0)

             {

                           cout<<"여기"<<endl;

             //          fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));

                           return FALSE;

             }

             printf("%s\n",m_CommandString);



             return TRUE;

}



//레코드선택                                                                          (SELECT valse FROM TableName WHERE condition) ex) "SELECT * FROM playerinfo"

BOOL CMySQLDB::SELECT_FROM_Table(const char* TableName,const char* valse, const char* condition,...)

{

             if(!TableName)

                           return FALSE;



             memset(m_CommandString,0, _countof(m_CommandString));

            

             //정렬할변수형들

             if(valse == NULL)

             {

                           sprintf_s(m_CommandString,"%s %c %s %s",SQL_SELECT,'*',SQL_FROM,TableName);

             }else

             {

                           sprintf_s(m_CommandString,"%s %s %s %s",SQL_SELECT,valse,SQL_FROM,TableName);

             }

             //찾을조건

             if(condition != NULL)

             {

                           char Con[255];

                           va_list argptr;

                           va_start( argptr, condition );

                           vsprintf_s(Con, condition, argptr );

                           va_end( argptr );



                           sprintf_s(m_CommandString,"%s %s",m_CommandString, SQL_WHERE ,Con);

             }

            

             m_dQuery_stat=mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);

             if (m_dQuery_stat != 0)

             {

                                        return FALSE;

             }



             cout<<m_CommandString<<endl;

             return TRUE;



}



//찾은테이블결과값을가져온다..

//레코드보기..sql_result //bool freeReult변수는DB에서Select해서찾은결과값을지울것인지를결정한다.

BOOL CMySQLDB::ViewTableresult(MYSQL_RES* &RefSql_result, bool freeReult)

{



             MYSQL_RES *sql_result;

             MYSQL_ROW sql_row;

             sql_result=mysql_store_result(m_DBInfo.m_MySQL_CONNECT);

             RefSql_result=sql_result;

            

             if(freeReult){

                           while((sql_row=mysql_fetch_row(sql_result))!=NULL)

                           {

                                        //fiele_count 값이열(col)의(테이블에선언된변수갯수) 이다.  

                                        for(int index =0; index<sql_result->field_count ; index++)

                                        {

                                                     printf("%s ",sql_row[index]);

                                        }

                                        printf("\n");

                           }

                           //mysql_free_result(sql_result);

             }

             return TRUE;

}