1. 程式人生 > >MySQL入門之C語言操作MySQL

MySQL入門之C語言操作MySQL

基本概念

C APIs包含在mysqlclient庫檔案當中,與MySQL的原始碼一塊發行,用於連線到資料庫和執行資料庫查詢。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <mysql/mysql.h>

int main()
{
    int     ret = 0;
    MYSQL   mysql;
    MYSQL   *con = NULL;

    con = mysql_init(&mysql);
    if
(con == NULL) { ret = mysql_errno(&mysql); printf("func mysql_init() err :%d\n", ret); return ret; } //連線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) ;
con = mysql_real_connect(&mysql, "localhost", "root", "123456", "mydb2", 0, NULL, 0 ); if (con == NULL) { ret = mysql_errno(&mysql); printf("func mysql_real_connect() err :%d\n", ret); return ret; } else { printf("func mysql_real_connect() ok\n"
); } mysql_close(&mysql); return ret; }

程式設計步驟

1 通過呼叫mysql_library_init(),初始化MYSQL庫
2 通過呼叫mysql_init()初始化連線處理程式,並通過呼叫mysql_real_connect()連線到伺服器
3 發出SQL語句並處理其結果
4 通過呼叫mysql_close(),關閉與MYSQL伺服器的連線
5 通過呼叫mysql_library_end(),結束MYSQL庫的使用

編譯需要注意的問題

  1. 問題1:
    [[email protected] dm01]$ gcc -o dm11_hello dm11_hello.c -I/usr/include/ -L/usr/lib64/mysql/ -lmysqlclient
    /usr/lib64/mysql//libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to __gxx_personality_v0'
    /usr/lib64/mysql//libmysqlclient.a(password.c.o): In function
    scramble_323’:

需要用到c++的動態庫,在編譯選項中新增-lstdc++選項

  1. 問題2
    /usr/lib64/mysql//libmysqlclient.a(dso_dlfcn.o): In function dlfcn_globallookup':
    dso_dlfcn.c:(.text+0x31): undefined reference to
    dlopen’
    dso_dlfcn.c:(.text+0x44): undefined reference to dlsym'
    dso_dlfcn.c:(.text+0x4f): undefined reference to
    dlclose’
    /usr/lib64/mysql//libmysqlclient.a(dso_dlfcn.o): In function dlfcn_pathbyaddr':
    dso_dlfcn.c:(.text+0xa0): undefined reference to
    dladdr’
    dso_dlfcn.c:(.text+0x101): undefined reference to dlerror'
    /usr/lib64/mysql//libmysqlclient.a(dso_dlfcn.o): In function
    dlfcn_bind_func’:
    dso_dlfcn.c:(.text+0x464): undefined reference to `dlsym’

回撥函式的正反向呼叫,需要使用到dl函式庫,在編譯選項中新增-ldl選項

  1. 問題3

thread_mutex_trylock’
/usr/lib64/mysql//libmysqlclient.a(my_thr_init.c.o): In function my_thread_global_end':
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/mysys/my_thr_init.c:214: undefined reference to
pthread_key_delete’
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/mysys/my_thr_init.c:217: undefined reference to pthread_mutexattr_destroy'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/mysys/my_thr_init.c:220: undefined reference to
pthread_mutexattr_destroy’

MySQL的動態庫用到多執行緒,所以編譯選項中新增-lpthread選項

4.問題4

[[email protected] dm01]$ gcc -o dm11_hello dm11_hello.c -I/usr/include/ -L/usr/lib64/mysql/ -lmysqlclient -ldl -lstdc++ -lpthread
/usr/lib64/mysql//libmysqlclient.a(my_getsystime.c.o): In function my_getsystime':
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/mysys/my_getsystime.c:44: undefined reference to
clock_gettime’
collect2: ld 返回 1
[[email protected] dm01]$

缺少執行時動態庫以及數學庫,新增-lm以及-lrt選項

完整的gcc編譯命令:

gcc -o hello hello.c -I/usr/include/mysql/ -L/usr/lib/i386-linux-gnu/ -lmysqlclient -lm -ldl -lstdc++ -lpthread -lrt

一般Makefile編寫


.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
LFLAGS=-L/usr/lib/i386-linux-gnu/ -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++

BIN=hello 

all:$(BIN)

%.o:%.c
    $(CC) $(CFLAGS)  -c $<  -o   [email protected] 

hello:hello.o 
    $(CC) $(CFLAGS) $^  $(LFLAGS) -o  [email protected] 

clean:
    rm -f *.o $(BIN)