2012. 5. 24. 16:53

출처 : http://blog.naver.com/asloud?Redirect=Log&logNo=10101192728



C 언어로 MySQL 연결하는 방법.



C 언어를 사용하여 MySQL을 연결하는 사용하는 방법을 남겨본다.

Java로는 많이 해보았지만 C 언어로 DB 연결을 해본 경험이 없었다. 그리하여 대강 파악한 방법을 남겨본다.

이렇게 남겨야 나중에 찾아보기라도 하지.

1. 준비

1) MySQL 설치

MySQL을 설치하면 C 개발에 필요한 해더파일들과 라이브러리들도 설치된다.

2) VIsual Studio

환경이 Windows라서 Visual Studio로 개발.

Visual Studio의 프로젝트 생성 후 필요한 해더파일, 라이브러리들을 설정해야 한다.

3) 필요한 해더 파일과 라이브러리들은 MySQL의 설치 경로 아래에 있다.

예를 들어 MySQL의 설치 경로가 "C:\Program Files\MySQL\MySQL Server 5.5" 라면

그 하위 폴더 중 include 폴더 해더 파일들이 존재

그 하위 폴더 중 lib 폴더에 라이브러리 파일들이 존재

4) Visual Studio 프로젝트 설정

해더파일 추가

[프로젝트] → [속성] 으로 들어간다.

[구성속성] → [C/C++] → [일반]

[추가포함 디렉토리]에 MySQL의 해더파일 디렉토리를 추가

라이브러리 추가

[구성속성] → [링커] → [일반]

[추가 라이브러리 디렉토리]에 라이브러리 디렉토리 추가

"libmysql.lib" 설정

[구성속성] → [링커] → [입력]

[추가 종속성]에 "libmysql.lib"을 추가한다

프로젝트 폴더에 "libmysql.dll" 파일을 복사하여야 한다. "libmysql.dll" 파일 없이 실행하면 "libmysql.dll" 파일이 없어 에러가 발생한다.

완성된 프로그램의 실행을 위해서라면 system32 폴더 밑에 "libmysql.dll" 파일을 두어야 한다.

2. API

1) 제일 첫 줄은 [#define SOCKET int] 이어야 한다고 한다.이유는 ws2_32.lib를 추가하는 수고를 덜기 위해서라고 한다.

2) 당연한 이야기이지만 mysql.h 파일을 include해야 한다. 위의 설정을 잘 했다면 my라고만 쳐도 visual studio가 알아서 파일 이름을 찾아줄 것이다.

변수

MYSQL

MySQL DB와 연결을 관리하는 구조체.

This structure represents a handle to one database connection.

MYSQL_RES

쿼리의 결과를 나타내는 자료형. Result set으로 불림.

This structure represents the result of a query that returns rows (SELECT, SHOW,DESCRIBE, EXPLAIN).

MYSQL_ROW

MYSQL_RES에서 하나의 레코드씩 값을 얻어 올 때 쓰이는 자료형. mysql_fetch_row() 함수에서 쓰임.

This is a type-safe representation of one row of data.

MYSQL_FILED

필드의 이름과 필드의 타입 등 필드에 관한 정보를 저장하는 구조체. mysql_fetch_field() 함수에서 쓰임.

This structure contains information about a field, such as the field's name, type, and size.

함수

mysql_init()

- mysql_real_connect() 함수를 위해 MYSQL 객체를 할당 및 초기화

MYSQL *mysql_init(MYSQL *mysql)

mysql이 NULL이라면 새로운 MYSQL 객체를 할당 및 초기화 하여 반환한다.

- 매개별수

mysql :

- 반환 값 : An initialized MYSQL* handle.


mysql_real_connect()

- host에서 실행중인 MySQL 데이터베이스 엔진에 연결을 설정하려고 시도하는 함수

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

- 매개변수

mysql : MYSQL 구조체의 포인터

host : 연결하고자 하는 서버의 IP 주소 또는 도메인 이름, NULL이면 localhost를 의미

user : MySQL의 로그인 ID. NULL이거나 빈 문자열이면 현재 로그인한 유저

passwd : user의 패스워드. NULL이면 패스워드가 없다는 뜻

db : 접속하려는 데이터베이스 이름. NULL 이면 기본 데이터베이스를 설정한다

port : 연결시 사용할 포트

unix_socket : unix_socket이 NULL이 아니면, 사용할 소켓이나 파이프 이름을 지정. 보통 NULL로 사용한다

client_flag : 보통 0으로 사용한다. 여러가지 플래그 값을 사용할 수 있다.

- 반환 값 : 연결이 성공하면 MYSQL* connection 핸들을 넘겨준다. 연결 실패면 NULL을 반환

mysql_close()

- 이전에 연 연결을 닫는다

void mysql_close(MYSQL *mysql)

- 매개변수

mysql : 연결을 가지고 있는 핸들

- 반환 값 : 없음

mysql_query()

- 쿼리문을 실행시킨다. 쿼리 문장에는 세미콜론(;)을 포함시키지 않는다.

바이너리 데이터를 포함시켜 사용할 수 없다(바이너리 데이터는 NULL 문자('\0')를 포함할 수 있어서). 대신 mysql_real_query()를 사용하여야 한다.

int mysql_query(MYSQL *mysql, const char *stmt_str)

- 매개변수

mysql : 연결 핸들

stmt_str : 실행할 쿼리 문. 세미 콜론을 포함하지 않는다

- 반환 값 : 성공하면 0을 반환한다

mysql_real_query()

- length 바이트 길이의 쿼리 문장을 실행. 바이너리 데이트를 포함하는 문장 사용 가능

int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)

- 매개변수

mysql : 연결 핸들

stmt_str : 실행할 쿼리 문.

length : 쿼리 문장 길이

- 반환 값 : 성공하면 0을 반환한다.

mysql_store_result()

- 쿼리 문 실행 후 결과값을 가져온다. 쿼리 결과의 모든 ROW들를 한번에 얻어 온다

MYSQL_RES *mysql_store_result(MYSQL *mysql)

- 반환 값 :

MYSQL_RES : A MYSQL_RES result structure with the results. NULL 이면 실패

mysql_use_result()

- 쿼리 문 실행 후 결과 값을 가져오는 데 mysql_store_result() 함수와는 달리 한 개의 ROW만 가져온다

MYSQL_RES *mysql_use_result(MYSQL *mysql)

- 반환 값 :

MYSQL_RES : A MYSQL_RES result structure. NULL 이면 실패

mysql_fetch_row()

- 결과 ROW들을 담은 result에서 다음 ROW를 얻어 온다

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

- 매개 변수

result : 결과 ROW들을 담고 있는 구조체 포인터

- 반환 값 : 다음 ROW인 MYSQL_ROW 구조체


mysql_free_result()

- mysql_store_result() 함수에 의해 할당된 메모리를 해제한다

void mysql_free_result(MYSQL_RES *result)

- 매개 변수

result : 메모리를 할당할 MYSQL_RES 구조체 포인터

- 반환 값 : 없음

3. 예제 소스 코드

#define SOCKET int // 이거 해주어야 한다고 하더라고
#include<stdio.h>
#include<string.h>
#include<mysql.h> // MySQL을 연결하기 위해 꼭 필요한 해더 파일

// Database에 연결하기 위한 기본적인 정보
#define HOST "localhost" // 연결할 host 주소
#define USER "name" // 사용자 이름
#define PASS "pw" // 패스워드
#define NAME "database_name" // 접속할 데이터베이스 이름

int main(void){

char* query="select * from table_name"; // 실행할 쿼리
int len;

MYSQL* conn_ptr; // MySQL과의 연결을 담당
MYSQL_RES* res; // 쿼리에 대한 결과를 받는 변수
MYSQL_ROW row; // 쿼리에 대한 실제 데이터 값이 들어있는 변수

conn_ptr=mysql_init(NULL); // 초기화
if(!conn_ptr){
printf("mysql_init failed!!\n");
}

// MySQL에 연결
conn_ptr=mysql_real_connect(conn_ptr, HOST, USER, PASS, NAME, 3306, (char*)NULL, 0);

if(conn_ptr){
printf("연결 성공\n");
}else{
printf("연결 실패\n");
}

// 쿼리 실행
// mysql_query() 실행 후 반환값이 0이어야 성공
len=mysql_query(conn_ptr, query);

res=mysql_store_result(conn_ptr); // 전속한 결과 값을 MYSQL_RES 변수에 저장

// 쿼리 결과 값 출력
while((row=mysql_fetch_row(res))!=NULL){ // 한 ROW 씩 얻어 온다
printf("%s %s %s %s\n", row[0], row[1], row[2]); // 결과 값 출력
}

// 할당 된 메모리 해제
mysql_free_result(res);
mysql_close(conn_ptr);

return 0;
}

Posted by k1rha