linux程序設計——使用C語言訪問MySQL(第八章)
8.3 使用C語言訪問MySQL數據
Windows本地程序(如Access)可以通過ODBC驅動程序來訪問MySQL,甚至有針對linuxODBC驅動程序。
下面討論使用C語言來訪問MySQL.
8.3.1 連接例程
用C語言連接MySQL數據庫包含兩個步驟:
1.初始化一個連接句柄結構
2.實際進行連接
首先,使用
mysql_init來初始化連接句柄:
#include <mysql.h>
MYSQL *mysql_init(MYSQL *);
通常傳遞NULL給這個例程,它會
返回一個指向新分配的連接句柄結構的指針。如果傳遞一個已有的結構,它將被重新初始化。這個例程出錯時返回NULL。
目前為止,只是分配和初始化了一個結構,仍然需要
使用mysql_real_connect來向一個連接提供參數:
MYSQL *mysql_real_connect(MYSQL *connection,
const char *server_host,
const char *sql_user_name,
const char *sql_password,
const char *db_name,
unsigned int port_number,
const char *unix_socket_name,
unsigned int flags);
指針connection必須指向已經被mysql_init初始化過的結構。其他參數的含義相當明了,server_host既可以是主機名,也可以是IP地址。如果只是連接到本地機器,可以通過指定localhost來優化連接類型。
sql_user_name和sql_password的含義和它們的字面含義一樣。如果登錄名為NULL,則假設登錄名為當前linux用戶的登錄ID。如果密碼是NULL,則只能訪問服務器上無需密碼就可訪問的數據。密碼會在通過傳輸前進行加密。
port_number和unix_socket_name應該分別為0和NULL,除非改變了MYSQL安裝的默認設置。
flag參數用來對一些定義的位模式進行OR操作,使得改變使用協議的某些特征。
如果無法連接,它將返回NULL。mysql_error函數可以提供有幫助的信息。
使用完連接之後,通常
在程序退出時,要像下面這樣
調用函數mysql_close:
void mysql_close(MYSQL *connection);
這將關閉連接,如果連接是由mysql_init建立的,MySQL結構會被釋放。指針將會無效並無法再次使用。
mysql_options例程(僅能在mysql_init和mysql_real_connect之間調用)可以設置一些選項:
int mysql_options(MYSQL *connection, enum option_to_set, const char *argument);
因為mysql_options一次只能設置一個選項,所以每設置一個選項就要調用它一次。下面列出了3個最常用的選項:
enum選項 實際參數類型 說明
MySQL_OPT_CONNECT_TIMEOUT const unsigned int * 連接超時之前的等待秒數
MySQL_OPT_COMPRESS None,使用NULL 網絡連接中使用壓縮機制
MySQL_INIT_COMMAND const char * 每次連接建立後發送的命令
如果要設置連接超時時間為7秒,使用的代碼片段如下所示:
unsigned int timeout = 7;
connection = mysql_init(NULL);
ret = mysql_options(connection, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);
if (ret){
}
connection = mysql_real_connect(connection...)
接下來使用一個簡短的程序測試一下。
首先進入rick用戶,創建一個數據庫foo;
mysql -u rick -p
CREATE DATABASE foo;
如果直接在mysql命令行中輸入許多創建表和添加數據的命令,這比較容易出錯,而且如果再次輸入這些命令的話,也很不高效。因此,創建一個包含所需要命令的文件。
這個文件名為create_children.sql;
\. /絕對路徑/create_children.sql 來執行這個文件
一定要使用create_children.sql的絕對路徑.
現在有一個用戶,一個數據庫和一個保存了一些數據的表,接下來看一下如果通過代碼來訪問這些數據。
編寫程序connect1.c,它以用戶名rick和密碼secret來連接本機服務器上名為foo的數據庫。
如果出現mysql.h找不到的情況,參見linux找不到mysql.h.
編譯這個程序需要同時添加include路徑和庫文件路徑,以及指定鏈接的庫模塊mysqlclient.
$ gcc connect1.c -o connect1.exe -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
-I/usr/include/mysql是mysql.h的頭文件路徑
-L/usr/lib/mysql是庫文件路徑
8.3.2 錯誤處理
MySQL使用一系列由連接句柄結構報告的返回碼.兩個必備的例程是:
unsigned int mysql_errno(MYSQL *connection);
char *mysql_error(MYSQL *connection);
可以通過
調用mysql_errno並傳遞連接結構來獲得錯誤碼,它通常都是非0值.如果未設定錯誤碼,它將返回0.
mysql_errno的返回值實際上就是錯誤碼,它們在errmsg.h或者mysqld_error.h中定義,前者是報告客戶端錯誤,後者關注服務端錯誤.
mysql_error提供有意義的文本信息,而不是單調的錯誤碼,這些信息被寫入一些內部靜態內存空間中,如果想保存錯誤文本,需要把它復制到別的地方.
當調用mysql_real_connect時會遇到一個問題,因為它在失敗時返回NULL指針,並沒有提供一個錯誤碼.但如果將連接句柄作為一個變量,那麼及時mysql_real_connect失敗,仍然能夠處理它.
編寫程序connect2.c,它示例如何使用非動態分配的連接結構,以及如何編寫一些基本的錯誤處理代碼.