2010년 1월 20일 수요일

MySql C API DB 리스트가져오기, 접속, 추가, 삭제

#define SQL_CREATE                     "CREATE" 
#define SQL_DROP                        "DROP" 

#define SQL_TABLE                       "TABLE"
#define SQL_DATABASE                "DATABASE"


//DB리스트를가져온다.
BOOL CMySQLDB::GetDBList(MYSQL_RES*  &Refresul)
{
             MYSQL_RES*  result =NULL;

             result= mysql_list_dbs(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;
             }else
                           return FALSE;

}
//DB 접속
BOOL CMySQLDB::SelectDB(const char* DBNAME)
{
             if(!DBNAME)return FALSE;
            
             //DB접속
             m_dQuery_stat=mysql_select_db(m_DBInfo.m_MySQL_CONNECT, DBNAME);
             if (m_dQuery_stat != 0)
             {
                         //fprintf(stderr, "Mysql selectDB error : %s", mysql_error(&conn));
                           return FALSE;
             }
             return TRUE;
}
//DB생성
BOOL CMySQLDB::CreateDB(const char* DBNAME)
{
             //SQL_CREATE
             if(!DBNAME) return FALSE;

             memset(m_CommandString,0, _countof(m_CommandString));
             sprintf_s(m_CommandString,"%s %s %s",SQL_CREATE,SQL_DATABASE, DBNAME);
             cout<<m_CommandString<<endl;

             m_dQuery_stat=mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);
             if (m_dQuery_stat != 0)
             {
                           return FALSE;
             }

             return TRUE;
}

//DB삭제
BOOL CMySQLDB::DeleteDB(const char* DBNAME)
{
             //SQL_CREATE
             if(!DBNAME)
                           return FALSE;

             memset(m_CommandString,0, _countof(m_CommandString));
             sprintf_s(m_CommandString,"%s %s %s",SQL_DROP,SQL_DATABASE, DBNAME);
             cout<<m_CommandString<<endl;

             m_dQuery_stat=mysql_query(m_DBInfo.m_MySQL_CONNECT,m_CommandString);
             if (m_dQuery_stat != 0)
             {
                           return FALSE;
             }

             return TRUE;
}

MySql 목록 가져오기

MYSQL *connection=NULL, conn;
mysql_init(&conn);
 // DB 연결 
 connection = mysql_real_connect(&conn, DB_HOST,
          DB_USER, DB_PASS,NULL, 3306,(char *)NULL, 0);
 if(connection==NULL)
 {
  return false;
 }

//DB 목록보기
 MYSQL_RES*  result =NULL;
 result= mysql_list_dbs(connection,"%");
 if(result)
 {
  printf("-DB목록-\n");
  while(result->data->data !=NULL){
      printf("%s\n",*(result->data->data->data));
      result->data->data =  result->data->data->next;
  }
 }

-설명-
 기본형 : MYSQL_RES* mysql_list_dbs(MYSQL* mysql, const char* wild)
             현재 서버에 있는 데이타베이스의 목록을 리턴한다.
             wild는 MySQL에서 사용할 수 있는 정규식을 나타낸다.    
              ex) result = mysql_list_dbs( &mysql,"%" )
                  ("%"는 '모든'을 나타냄)
 *DB 이름을 가져올땐 링크드 리스트로 연결되어있기때문에 위처럼 찾아가야한다.


MySql 과 C++ 연동

MYSQL 과 C++ 연동

1. MYSQL 설시시 아래 CIncdude Files /Lib Files 도 설치하도록 하자



2. MY SQL의 헤더파일 폴더과 라이브러리 폴더를 등록해준다.









































































3. MYSQL 홈피(http://dev.mysql.com)에 접속해서
downloads>connector > Connector 가서
Conector /C 부부관 Conector /C++를 받아서 설치한다.
이유는 MySQL의 함수 집합체인 DLL은 libmysql.dll 를 얻기위해서다.


4. 연동 코드

 
#define SOCKET int

#include <string.h>
#include <stdio.h>
#include <mysql.h>

#pragma comment(lib, "libmysql.lib")
#pragma comment(lib, "ws2_32.lib")  

#define DB_HOST "127.0.0.1"//"호스트IP, 도메인또는localhost"
#define DB_USER "root"
#define DB_PASS "2513"
#define DB_NAME "game"

#define SQL_CREATE_TABLE  "CREATE TABLE playerinfo(id INT AUTO_INCREMENT, name VARCHAR(30), xpos INT, PRIMARY KEY(id));"
#define SQL_INSERT_RECORD "INSERT INTO playerinfo VALUES \
(NULL , %s, %d);" //"
#define SQL_SELECT_RECORD "SELECT * FROM playerinfo"
#define SQL_DROP_TABLE "DROP TABLE playerinfo"



int main()
{
             MYSQL *connection=NULL, conn;
             MYSQL_RES *sql_result;
             MYSQL_ROW sql_row;
             int query_stat;
             int i;

             char query[255];

             mysql_init(&conn);

             // DB 연결
             connection = mysql_real_connect(&conn, DB_HOST,
                           DB_USER, DB_PASS,DB_NAME, 3306,(char *)NULL, 0);
             if(connection==NULL)
             {
                           fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
                           return 1;
             }
            
             // 테이블삭제
             query_stat=mysql_query(connection,SQL_DROP_TABLE);
             if (query_stat != 0)
             {
                           fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
             //          return 1;
             }
            
             //한글사용을위해추가.
             mysql_query(connection,"set session character_set_connection=euckr;");
             mysql_query(connection,"set session character_set_results=euckr;");
             mysql_query(connection,"set session character_set_client=euckr;");

             //// 테이블생성
             query_stat=mysql_query(connection,SQL_CREATE_TABLE);
             if (query_stat != 0)
             {
                           cout<<"여기?"<<endl;
                           fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
                           return 1;
             }

             // 레코드삽입
             for(i=0;i<5;i++)
             {
                           sprintf(query,SQL_INSERT_RECORD,"'ㅁㅁㅁ'",100+i);
                           cout<<query<<endl;
                           query_stat = mysql_query(connection, query);
                          
                           if (query_stat != 0)
                           {
                                        cout<<"여기"<<endl;
                                        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
                                        return 1;
                           }
             }

             // 셀렉트
             query_stat=mysql_query(connection,SQL_SELECT_RECORD);
             if (query_stat != 0)
             {
                           fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
                           return 1;
             }

             // 결과출력
             sql_result=mysql_store_result(connection);
             while((sql_row=mysql_fetch_row(sql_result))!=NULL)
             {
                           printf("%2s %2s %s\n",sql_row[0],sql_row[1],sql_row[2]);
             }
             mysql_free_result(sql_result);

             // 테이블삭제
             query_stat=mysql_query(connection,SQL_DROP_TABLE);
             if (query_stat != 0)
             {
                           fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
                           return 1;
             }

             // DB 연결닫기
             mysql_close(connection);
             return 0;
}


여기서 중요한 한가지 C++로 DB로 정보를 보낼때 한글를 재대로 보내기 위해서는
            //한글사용을위해추가.
             mysql_query(connection,"set session character_set_connection=euckr;");
             mysql_query(connection,"set session character_set_results=euckr;");
             mysql_query(connection,"set session character_set_client=euckr;");
이부분을 추가해줘야한다.