'mysql c api'에 해당되는 글 4건
- 2011.07.12 mysql_[real_]query() - SQL 쿼리 실행
- 2011.07.12 MySQL C API - 오류처리 (mysql_errno, mysql_error)
- 2011.07.12 mysql_options() - 연결 옵션을 설정
- 2011.07.11 mysql_real_connect() - MySQL 데이터베이스 연결
▶ Null로 종결된 문자열 query 에 의해 가리키는 SQL 명령문을 실행한다.
mysql_query() - SQL 쿼리 실행 | |
형태 | int mysql_query(MYSQL *mysql, const char *query) |
리턴값 | 성공 : 0(zero) 에러 : Non-Zero. |
▶ length 바이트 길이의 문자열인 query에 의해 가리키는 SQL 쿼리를 실행한다.
mysql_real_query() - SQL 쿼리 실행 (바이너리 데이터를 포함한 쿼리) | |
형태 | int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) |
리턴값 | 성공 : 0(zero) 에러 : Non-Zero. |
▷ 일반적으로, 문자열은 하나의 싱글 SQL 명령문으로 구성된다.
그리고 사용자는 명령문에 종료 세미콜론 (';') 또는 \g를 명령문에 추가하지 말아야 한다.
다중 명령문 실행이 가능했다면, 문자열은 세미콜론들로 구분된 여러 개의 명령문으로 구성될 수 있다.
▷ mysql_query() 함수는 바이너리 데이터를 포함하는 쿼리들의 경우 사용될 수 없다.
바이너리 데이터에는 '\0' 문자가 포함될 수 있는데, mysql_query() 함수는 쿼리 문자열의 끝으로 해석될 수 있다.
바이너리 데이터를 포함한 쿼리의 경우 mysql_query() 함수보다 mysql_real_query() 함수를 사용.
▷ 쿼리 문자열에서 strlen() 을 호출하지 않기 때문에, mysql_real_query() 함수가 mysql_query() 함수보다 더 빠름.
▷ 쿼리 명령문이 결과 셋을 리턴하는지 알고 싶다면, mysql_field_count()를 사용해서 검사하도록 한다.
[ 에러 ] | |
CR_COMMANDS_OUT_OF_SYNC | 명령문이 불규칙한 순서로 실행됨 |
CR_SERVER_GONE_ERROR | MySQL 서버가 중단됨. |
CR_SERVER_LOST | 쿼리 동안 서버로의 연결이 끊김. |
CR_UNKNOWN_ERROR | 알 수 없는 에러 발생. |
'API 및 라이브러리 > MySQL C API' 카테고리의 다른 글
MySQL C API - 오류처리 (mysql_errno, mysql_error) (0) | 2011.07.12 |
---|---|
mysql_options() - 연결 옵션을 설정 (0) | 2011.07.12 |
mysql_real_connect() - MySQL 데이터베이스 연결 (0) | 2011.07.11 |
mysql_config명령을 이용한 MySQL C API 컴파일 (0) | 2011.07.11 |
MySQL C API 데이터 타입 (1) | 2011.07.11 |
▷ 모든 API함수에 대한 오류는 에러 코드를 되돌려 줌으로서 나타나며,
세부 내용은 접속 처리 구조체를 통해 알려준다.
오류 메시지를 처리할 때 다음과 같인 두 개의 루틴만 알고 있으면 된다.
mysql_errno() - 가장 최근에 실행된 MySQL API 함수의 에러 코드를 리턴. | |
형태 | unsigned int mysql_errno(MYSQL *mysql) |
인수 | mysql: MYSQL* 핸들 |
반환값 | 에러가 있을 경우: 마지막으로 호출된 API함수(mysql()_xxx)를 위한 에러 코드. 에러가 없을 경우: 0(zero) |
mysql_error() - 가장 최근에 실행된 MySQL API 함수의 에러 메시지 문자열 리턴. | |
형태 | const char *mysql_errno(MYSQL *mysql) |
인수 | mysql: MYSQL* 핸들 |
반환값 | 에러가 있을 경우: 마지막으로 호출된 API함수(mysql()_xxx)를 위한 에러 메시지 문자열. 에러가 없을 경우: 빈 문자열. |
▶ mysql_error()함수의 메시지는 내부의 정적 공간이므로,
오류 메시지를 저장하려면 메시지를 다른 위치에 복사하면 된다.
▶ mysql_errno() 함수에 의해 리턴된 MySQL-지정 에러 숫자들은
mysql_sqlstate() 함수에 의해 리턴된 SQLSTATE 값과 다르다.
예를 들어, mysql 클라이언트 프로그램은 다음 포맷을 사용 중인 에러들을 보여준다.
여기서 1146 은 mysql_errno() 함수 값이고, '42S02'는 mysql_sqlstate() 함수 값과 일치한다:
shell> SELECT * FROM no_such_table; ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist |
주의:
mysql_fetch_row() 같은 몇몇 함수들은 성공하면 mysql_errno()를 설정하지 않음.
(경험적으로 서버에 정보를 요구하는 함수는, 성공했을 경우에 mysql_errno()를 재설정)
에러 메시지가 기술된 헤더 파일:
클라이언트 에러 메시지 숫자: MySQL errmsg.h 헤더 파일에 기술.
서버 에러 메시지 숫자 : mysqld_error.h 헤더 파일에 기술.
예제:
MYSQL mysql; … mysql_init(&mysql); mysql_option(&mysql, MYSQL_READ_DEFAULT_GROUP, "your_prog_name"); if ( ! mysql_real_connect(&mysql, "host", "user", "passwd", "database", 0, NULL, 0)) { ■■■■fprintf(stderr, "Connection error %d: %s\n", mysql_errno(&mysql), mysql_error(&mysql)); } … |
'API 및 라이브러리 > MySQL C API' 카테고리의 다른 글
mysql_[real_]query() - SQL 쿼리 실행 (0) | 2011.07.12 |
---|---|
mysql_options() - 연결 옵션을 설정 (0) | 2011.07.12 |
mysql_real_connect() - MySQL 데이터베이스 연결 (0) | 2011.07.11 |
mysql_config명령을 이용한 MySQL C API 컴파일 (0) | 2011.07.11 |
MySQL C API 데이터 타입 (1) | 2011.07.11 |
mysql_options() - 별도 연결 옵션을 설정하는데 사용될 수 있으며, 연결 시 작동에 영향을 미칠 수 있다. |
|
형태 |
int mysql_options(MYSQL *mysql, enum mysql_option option, const void *argument) |
인수 |
mysql: MYSQL* 핸들 option: 사용자가 설정을 원하는 옵션 argument: 옵션 값. (옵션이 정수라면, 포인터로 가리킨다) |
리턴값 |
성공: 0(Zero). 실패: 알 수 없는 옵션을 사용하면, Non-zero. |
▶ mysql_init() 함수 후에 그리고 mysql_connect() 또는 mysql_real_connect()함수 전에 호출되어야 한다.
mysql_init(); mysql_options() ß mysql_init()와 mysql_connect() 사이에 필요한 횟수만큼 이 루틴을 호출 할 수 있다. mysql_options() … mysql_connect(); |
▶ 일반적으로 자주 사용하는 옵션 몇 가지:
enum 옵션 |
변수 타입 |
기능 |
MYSQL_INIT_COMMAND |
const char * |
접속한 시간을 매 시간 보내는 명령 |
MYSQL_OPT_COMPRESS |
None (use NULL) |
압축된 클라이언트/서버 프로토콜을 사용. |
MYSQL_OPT_CONNECT_TIMEOUT |
unsigned int * |
접속의 타임 아웃 시간(초 단위). |
MYSQL_READ_DEFAULT_FILE |
char * |
my.cnf 로부터 대신에 네임드 옵션 파일에서 옵션을 읽음 |
MYSQL_READ_DEFAULT_GROUP |
char * |
my.cnf의 네임드 그룹 또는 MYSQL_READ_DEFAULT_FILE 로 지정한 파일에서 옵션을 읽음 |
▷ MYSQL_READ_DEFAULT_FILE 또는 MYSQL_READ_DEFAULT_GROUP 을 사용하면,
client 그룹은 항상 읽힌다는 것을 명심하라.
▶ 옵션 파일에서 지정된 그룹은 다음 옵션들을 포함할 수 있다:
옵션 |
설명 |
connect-timeout |
수 초 내에 타임아웃 연결. 리눅스에서 이 타임아웃은 서버로부터 처음 응답을 기다리는데 사용된다. |
compress |
간단한 클라이언트/서버 프로토콜을 사용. |
database |
연결 명령문에 데이터베이스가 지정되어 있지 않았다면, 이 데이터베이스로 연결. |
debug |
디버그 옵션. |
disable-local-infile |
LOAD DATA LOCAL사용이 불가능 |
host |
디폴트 호스트이름. |
init-command |
MySQL 서버로 연결 시 실행하기 위한 명령. 재연결 시 자동으로재실행됨. |
interactive-timeout |
CLIENT_INTERACTIVE 를 mysql_real_connect()함수에 지정하는 것과 같다. 22.2.3.51, "mysql_real_connect()"장 참조 |
local-infile[=(0|1)] |
변수가 없거나 변수가 != 0 라면, LOAD DATA LOCAL사용이 가능하다. |
max_allowed_packet |
패킷 클라이언트 최대 사이즈는 서버로부터 읽을 수 있다. |
multi-results |
다중 명령문 실행 또는 스토어드 프로시져로부터 멀티 결과 셋허용. |
multi-statements |
클라이언트가 싱글 문자열(스트링/.';'로 나누어진) 내에 다중 명령문을 보내도록 허용. |
password |
디폴트 패스워드. |
pipe |
NT 기반에서 MySQL 서버에 연결하기 위해 명명된 파이프 사용. |
protocol={TCP|SOCKET|PIPE|MEMORY} |
서버로 연결 시 사용하는 프로토콜. |
port |
디폴트 포트 넘버. |
return-found-rows |
UPDATE 사용시, 업데이트된 로우들 대신에 검색된 로우들을 리턴하기 위해 mysql_info()함수를 호출. |
shared-memory-base-name=name |
서버로 연결하기 위해 사용되는 공유 메머리 이름(디폴트는"MYSQL"). |
socket |
디폴트 소켓 파일. |
user |
디폴트 사용자. |
[ 예제 ] |
MYSQL mysql; unsigned int timeout = 7; … mysql_init(&mysql); mysql_options(&mysql, MYSQL_OPT_COMPRESS, 0); mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "odbc"); mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); } … |
이 코드는 클라이언트가 압축된 클라이언트/서버 프로토콜을 사용(MYSQL_OPT_COMPRESS).
my.cnf 파일 내에서 odbc 섹션으로부터 추가적인 옵션을 읽도록 요청(MYSQL_READ_DEFAULT_GROUP).
접속 시간 초과를 7초로 설정(MYSQL_OPT_CONNECT_TIMEOUT).
'API 및 라이브러리 > MySQL C API' 카테고리의 다른 글
mysql_[real_]query() - SQL 쿼리 실행 (0) | 2011.07.12 |
---|---|
MySQL C API - 오류처리 (mysql_errno, mysql_error) (0) | 2011.07.12 |
mysql_real_connect() - MySQL 데이터베이스 연결 (0) | 2011.07.11 |
mysql_config명령을 이용한 MySQL C API 컴파일 (0) | 2011.07.11 |
MySQL C API 데이터 타입 (1) | 2011.07.11 |
mysql_real_connect() - Mysql 데이터베이스 엔진으로 연결 시도. |
|
형태 & 인수 |
MYSQL *mysql_real_connect( MYSQL *mysql, /* MYSQL 구조의 어드레스 */ const char *host, /* 호스트 이름 또는 IP 어드레스 (default = localhost) */ const char *user, /* MySQL Login ID (default = 현재 로그인 이름) */ const char *passwd, /* 패스워드 (default = none) */ const char *db, /* 데이터베이스 이름 (default = none) */ unsigned int port, /* TCP/IP 연결 포트 (use default) */ const char *unix_socket, /* 소켓 (use default) */ unsigned long client_flag) /* flag (none) */ |
리턴 값 |
성공 : MYSQL* 연결 핸들 (= 첫 번째 파라미터) 실패 : NULL |
사용자가 유효한 MYSQL 연결 핸들 구조를 요구하는 다른 어떤 API 함수를 실행할 수 있기 전에 성공적으로 완료되어야 한다. |
▶ client_flag 값은 대체로 0이다. 그러나 정확한 기능을 작동하기 위해 다음 플래그의 조합으로 설정될 수 있다:
플래그(Flag) 이름 |
플래그(Flag) 설명 |
CLIENT_COMPRESS |
압축 프로토콜 사용. |
CLIENT_FOUND_ROWS |
변경된 로우의 숫자가 아니라 찾은(맞는) 로우들의 숫자를 리턴. |
CLIENT_IGNORE_SPACE |
함수 이름 후에 공간 허용. 모든 함수 이름을 예비의 단어로 만듦. |
CLIENT_INTERACTIVE |
interactive_timeout 초 허용 (wait_timeout 초대신에) of inactivity before closing the connection. 클라이언트 세션 wait_timeout 변수는 세션 interactive_timeout 변수 값으로 설정. |
CLIENT_LOCAL_FILES |
LOAD DATA LOCAL 조정 가능. |
CLIENT_MULTI_STATEMENTS |
싱글 문자열 (';'로 나눠진)에서 클라이언트가 다중(멀티) 명령문을 보내도록 서버에 전달. 만약 이 플래그가 설정되어 있지 않다면, 멀티-명령문 실행은 불가능하다. |
CLIENT_MULTI_RESULTS |
클라이언트가 멀티-명령문 실행 또는 스토어드 프로시저로부터 멀티 결과 셋을 조정할 수 있다는 것을 서버에 전달. CLIENT_MULTI_STATEMENTS이 설정되어 있다면, 이것은 자동적으로 설정. |
CLIENT_NO_SCHEMA |
db_name.tbl_name.col_name 신텍스를 허용하지 않음. 이것은 ODBC용이다. ODBC 프로그램에곤란한 버그에 사용하는 신텍스를 사용할 경우, parser(쿼리문 분석기)가 에러를 출력하도록 한다. |
CLIENT_ODBC |
원격 데이터베이스를 사용할 때 ODBC를 사용하고 있는지 확인할 수 있다. |
CLIENT_SSL |
SSL 사용. 이 옵션은 어플리케이션 프로그램으로 설정될 수 없다; 이것은 내부적으로 클라이언트 라이브러리 내에 설정된다. mysql_real_connect()함수를 호출하기 전에mysql_ssl_set()함수를 사용. |
[ 에러 ] |
|
CR_CONN_HOST_ERROR |
MySQL 서버로의 연결 실패. |
CR_CONNECTION_ERROR |
로컬 MySQL 서버로의 연결 실패 |
CR_IPSOCK_ERROR |
IP소켓 생성 실패. |
CR_OUT_OF_MEMORY |
메모리 부족. |
CR_SOCKET_CREATE_ERROR |
유닉스 소켓 생성 실패. |
CR_UNKNOWN_HOST |
호스트 이름 용 IP 어드레스 찾기 실패. |
CR_NAMEDPIPEOPEN_ERROR |
윈도우에서 명명된 파이프 생성 실패 |
CR_NAMEDPIPEWAIT_ERROR |
윈도우에서 명명된 파이프 대기(wait for) 실패. |
CR_NAMEDPIPESETSTATE_ERROR |
윈도우에서 파이프 핸들러(조정자) 획득 실패 |
CR_SERVER_LOST |
connect_timeout > 0 이고 서버에 연결하는데 connect_timeout 초 보다 오래 걸리면 또는 서버가 or init-command을 실행하는 동안 죽는다면 실패. |
[ 예제 ]
#include <stdio.h> #include <stdlib.h> #include <mysql.h> #define def_host_name NULL /* host to connect to (default = localhost) */ #define def_user_name "rick" /* user name (default = your login name) "*/ #define def_password "bar" /* password (default = none) */ #define def_db_name NULL /* dtabases to use (default = none) */ #define def_port_num 0 /* use default port */ #define def_socket_name NULL /* use default socket name */ MYSQL my_conn; /* pointer to connection handler */ int main(int argc, char *argv[]) { mysql_init(&my_conn); if ( mysql_real_connect ( &my_conn, /* pointer to connection handler */ def_host_name, /* host to connect to */ def_user_name, /* user name */ def_password, /* password */ def_db_name, /* database to use */ def_port_num, /* port (use default) */ def_socket_name, /* socket (use default) */ 0) /* flags (none) */ ) { printf("Connection success\n"); } else { fprintf(stderr, "Failed to connect to databases: Error: %s\n", mysql_error(&my_conn)); } mysql_close(&my_conn); return EXIT_SUCCESS; }
'API 및 라이브러리 > MySQL C API' 카테고리의 다른 글
MySQL C API - 오류처리 (mysql_errno, mysql_error) (0) | 2011.07.12 |
---|---|
mysql_options() - 연결 옵션을 설정 (0) | 2011.07.12 |
mysql_config명령을 이용한 MySQL C API 컴파일 (0) | 2011.07.11 |
MySQL C API 데이터 타입 (1) | 2011.07.11 |
MySQL C API 함수 개요 (0) | 2011.07.10 |