2011. 7. 12. 22:02

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

알 수 없는 에러 발생.

 

Posted by devanix
2011. 7. 12. 06:16

▷ 모든 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));

}

 

Posted by devanix
2011. 7. 12. 02:59

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).

 

(※ 자세한 내용은 매뉴얼 페이지 참조)

Posted by devanix