출처 : 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 //
이거 해주어야 한다고
하더라고
// Database에 연결하기 위한
기본적인 정보
int main(void){ char* query="select * from table_name"; // 실행할 쿼리 MYSQL*
conn_ptr; // MySQL과의 연결을 담당
conn_ptr=mysql_init(NULL); //
초기화
// MySQL에
연결 if(conn_ptr){
// 쿼리
실행 res=mysql_store_result(conn_ptr); // 전속한 결과 값을 MYSQL_RES 변수에 저장 // 쿼리 결과 값
출력
// 할당 된 메모리
해제
return
0; |
'C,C++ ' 카테고리의 다른 글
리모트 버퍼오버플로우 간단한 예제 코드 (Remote BOF exploit simple example code) (0) | 2012.06.21 |
---|---|
IOCP Server & Client C 예제코드 (winsock2) [IOCP Server & Client using winsock2 via C (0) | 2012.06.06 |
winsock 에서 사용하는 함수를 linux 소켓에서 사용하기 (0) | 2012.05.22 |
ohhara 덤프 코드 출력 코드 헤더 [펌] (0) | 2012.04.27 |
음성채팅 프로그램 분석 [client] (Analysis about Voice chat) (1) | 2012.04.13 |