天天看點

mysql api---從一個小例子開始mysql程式設計入門(1)

C APIs包含在mysqlclient庫檔案當中,與MySQL的源代碼一塊發行,用于連接配接到資料庫和執行資料庫查詢

locate mysql.h 指令可以檢視mysql.h 位于/user/include/mysql/mysql.h

一個小例子來看一下mysql api 大概用法,用于列印hello world:

int main()

{

int ret = NULL;

MYSQL       mysql;
MYSQL       *connect;
//MYSQL_RES     *res;
//MYSQL_ROW row;
//char      *query;
//int       t, r;

/*
if (mysql_library_init(0, NULL, NULL)) {
    fprintf(stderr, "could not initialize MySQL library\n");
    exit(1);
}
*/
mysql_init(&mysql);//初始化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)
*/

/*
    unsigned int mysql_errno(MYSQL *mysql);
    const char *mysql_error(MYSQL *mysql);
*/

connect = mysql_real_connect(&mysql, "localhost", "root", "mysql", "pos", 0, NULL, 0 );
if (connect == NULL)
{
    ret = mysql_errno(connect);
    printf("func mysql_real_connect() err\n");
    return ret;
}
else
{
    printf(" ok......\n");
}

printf("connect:%d &mysql:%d \n",connect, &mysql );

mysql_close(connect);

//mysql_library_end();
           

}

從上面可以看出有幾個比較重要的函數

(1)MYSQL mysql_init(MYSQL mysql)

描述

配置設定或初始化與mysql_real_connect()相适應的MYSQL對象。如果mysql是NULL指針,該函數将配置設定、初始化、并傳回新對象。否則,将初始化對象,并傳回對象的位址。如果mysql_init()配置設定了新的對象,當調用mysql_close()來關閉連接配接時。将釋放該對象。

傳回值

初始化的MYSQL*句柄。如果無足夠記憶體以配置設定新的對象,傳回NULL。

錯誤

在記憶體不足的情況下,傳回NULL。

(2) mysql_real_connect()

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_real_connect()嘗試與運作在主機上的MySQL資料庫引擎建立連接配接。在你能夠執行需要有效MySQL連接配接句柄結構的任何其他API函數之前,mysql_real_connect()必須成功完成。

參數的指定方式如下:

· 第1個參數應是已有MYSQL結構的位址。調用mysql_real_connect()之前,必須調用mysql_init()來初始化MYSQL結構。通過mysql_options()調用,可更改多種連接配接選項。

· “host”的值必須是主機名或IP位址。如果“host”是NULL或字元串"localhost",連接配接将被視為與本地主機的連接配接。如果作業系統支援套接字(Unix)或命名管道(Windows),将使用它們而不是TCP/IP連接配接到伺服器。

· “user”參數包含使用者的MySQL登入ID。如果“user”是NULL或空字元串"",使用者将被視為目前使用者。在UNIX環境下,它是目前的登入名。在Windows ODBC下,必須明确指定目前使用者名。

· “passwd”參數包含使用者的密碼。如果“passwd”是NULL,僅會對該使用者的(擁有1個空密碼字段的)使用者表中的條目進行比對檢查。這樣,資料庫管理者就能按特定的方式設定MySQL權限系統,根據使用者是否擁有指定的密碼,使用者将獲得不同的權限。

注釋:調用mysql_real_connect()之前,不要嘗試加密密碼,密碼加密将由用戶端API自動處理。

· “db”是資料庫名稱。如果db為NULL,連接配接會将預設的資料庫設為該值。

· 如果“port”不是0,其值将用作TCP/IP連接配接的端口号。注意,“host”參數決定了連接配接的類型。

· 如果unix_socket不是NULL,該字元串描述了應使用的套接字或命名管道。注意,“host”參數決定了連接配接的類型。

· client_flag的值通常為0,但是,也能将其設定為下述标志的組合,以允許特定功能:

1.CLIENT_MULTI_STATEMENTS

通知伺服器,用戶端可能在單個字元串内發送多條語句(由‘;’隔開)。如果未設定該标志,将禁止多語句執行。

2.CLIENT_COMPRESS

使用壓縮協定。

3.CLIENT_SSL

使用SSL(加密協定)。該選項不應由應用程式設定,它是在用戶端庫内部設定的

MySQL開發環境熟悉

mysq的開發頭檔案目錄為 /usr/include/mysql 可以用locate mysql.h或者find指令檢視(find / -name "mysql.h" -type f -print)

mysq的開發 動态庫同上可以查找到libmysqlclient.so 在/usr/lib64/mysql下

編譯指令:

gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql –lmysqlclient (-I 指定頭檔案路徑 -L指定庫路徑)

典型錯誤1

/

/usr/lib64/mysql/libmysqlclient.a(dso_dlfcn.o): In function

dlfcn_globallookup':<br/>dso_dlfcn.c:(.text+0x31): undefined reference to

dlopen'

dso_dlfcn.c:(.text+0x44): undefined reference to

dlsym'<br/>dso_dlfcn.c:(.text+0x4f): undefined reference to

dlclose'

//libmysqlclient.a dlfcn_globallookup undefined reference to `dlopen'

/

分析:由dlopen ,dllsym可知缺少dl庫 隻需 編譯時加上 -ldl

典型錯誤2

/

dm01_hello.c:49: 警告:初始化将指針賦給整數,未作類型轉換

/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'<br/>/usr/lib64/mysql/libmysqlclient.a(password.c.o): In function

scramble_323':

/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to

floor'<br/>/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to

floor'

/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to

floor'<br/>/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to

floor'

/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to

floor'<br/>/usr/lib64/mysql/libmysqlclient.a(password.c.o):/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: more undefined references to

floor' follow

/usr/lib64/mysql/libmysqlclient.a(my_getsystime.c.o): In function `my_getsystime':

/

分析: 由undefined reference to

floor‘’ 可知缺少數學庫,連結上數學庫 -lm -lrt即可!<br/>典型錯誤3 <br/>dm01_hello.c:70: 警告:初始化将指針賦給整數,未作類型轉換<br/>//導緻沒有連結 libstdc++.so<br/>/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'

分析:由undefined reference to `__gxx_personality_v0'可知沒有連結 libstdc++.so,隻需-lstdc++即可

于是:

MySQL開發環境GCC寫法

gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++

以上一般針對64位系統出現的問題,對于32位系統無需這樣,隻需

gcc -o dm01_hello dm01_hello.c -lmysqlclient 即可!

因為32位環境下已經做了相應的工作!

上面寫的是不是很麻煩呢!有沒有簡單一點的寫法呢?有,引入makefile

MySQL開發環境makefile寫法

.PHONY:clean all #聲明為僞目标

CC=gcc

CFLAGS=-Wall -g

LFLAGS=-L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++

BIN=dm01_hello dm02_query

all:$(BIN)

%.o:%.c

$(CC) $(CFLAGS) -c $< -o $@

dm01_hello:dm01_hello.o

$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@

dm02_query:dm02_query.o

$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@

clean:

rm -f *.o $(BIN)

大概說一下幾個細節:

%.o:%.c

$(CC) $(CFLAGS) -c $< -o $@

其中%.o 和%.c會自動展開

$@目标 $< 第一個依賴 $^所有依賴

如上:

dm01_hello.o dm02_query.o : dm01_hello.c dm02_query.c

gcc -Wall -g -c dm01_hello.c -o dm01_hello.o

gcc -Wall -g -c dm02_query.c -o dm02_query.o

大概就是這個意思

下面将接着說,請看下一節!
mysql api---從一個小例子開始mysql程式設計入門(2)
           

轉載于:https://blog.51cto.com/13375232/2056746