2011-05-09 wcdj
可以通過許多不同的編程語言來訪問MySQL,例如,C,C++,Java,Perl,Python,Tcl,PHP等。本文主要總結使用C語言接口如何訪問MySQL數據。
(一) 連接例程
(二) 錯誤處理
(一) 連接例程
用C語言連接MySQL數據庫包含兩個步驟:
(1) 初始化一個連接句柄結構。使用mysql_init?來初始化連接句柄。
(2) 實際進行連接。使用mysql_real_connect來向一個連接提供參數。
其余步驟:
(3) 使用完連接之后,使用?mysql_close?關閉連接。
(4)?mysql_options用于設置選項。注意:僅能在 mysql_init 和 mysql_real_connect 之間調用。mysql_options 一次只能設置一個選項,所以每設置一個選項就得調用它一次。
具體過程如下:
登錄mysql
$ mysql -u root -p
輸入密碼
創建一個本地用戶wcdj
mysql> GRANT ALL ON *.* TO wcdj@localhost IDENTIFIED BY 'secretpassword';?? (注意:最后的分號)
退出root用戶
mysql> /q
Bye
登錄新創建的用戶wcdj
$ mysql -u wcdj --password=secretpassword
創建一個新的數據庫newdatabase
mysql> CREATE DATABASE newdatabase;
退出wcdj用戶
mysql> /q
編寫create_children.sql?文件,用于創建表和添加數據。
--
-- Create the table children
--
CREATE TABLE children (
childno int(11) NOT NULL auto_increment,
fname varchar(30),
age int(11),
PRIMARY KEY (childno)
);
--
-- Populate the table 'children'
--
INSERT INTO children(childno, fname, age) VALUES (1, 'wcdj', 21);
INSERT INTO children(childno, fname, age) VALUES (2, 'gerry', 22);
INSERT INTO children(childno, fname, age) VALUES (3, 'echo', 23);
登錄mysql
$ mysql -u wcdj --password=secretpassword newdatabase?? (注意,后面的newdatabase用于指定使用的數據庫)
在新的數據庫newdatabase中創建表children并添加數據:
mysql> /. create_children.sql
查看新添加的數據:
SELECT * from children;
1?? wcdj??? 21
2?? gerry?? 22
3?? echo??? 23
connect1.c
#include?
#include?
#include?"mysql.h"
intmain()
{
MYSQL?*conn_ptr;
conn_ptr?=?mysql_init(NULL);
if(!conn_ptr)
{
fprintf(stderr,?"mysql_init?failed/n");
returnEXIT_FAILURE;
}
conn_ptr?=?mysql_real_connect(conn_ptr,?"localhost","wcdj","123","newdatabase",?0,?NULL,?0);
if(conn_ptr)
{
printf("Connection?success/n");
}
else
{
printf("Connection?failed/n");
}
mysql_close(conn_ptr);
returnEXIT_SUCCESS;
}
編譯程序:
$ gcc -I/usr/include/mysql connect1.c -L/usr/lib/mysql -lmysqlclient -o connet1
測試:
$ ./connect1
Connection success
$
(二) 錯誤處理
(1) unsigned int?mysql_errno(MYSQL *connection);??? (錯誤碼)
(2) char *mysql_error(MYSQL *connection);??? ??? (文本錯誤信息)
可以通過調用 mysql_errno 并傳遞連接結構來獲得錯誤碼,它通常都是非0值。如果未設定錯誤碼,它將返回0。
注意:因為每次調用庫都會更新錯誤碼,所以你只能得到最后一個執行命令的錯誤碼。但是,上面列出的兩個錯誤檢查例程是例外,它們不會導致錯誤碼的更新。
也可以調用 mysql_error ,來提供有意義的文本信息而不是單調的錯誤碼。這些信息被寫入一些內部靜態內存空間中,所以如果想保存錯誤文本,你需要把它復制到別的地方。
注意:當調用 mysql_real_connect 時會遇到一個問題,因為它在失敗時返回NULL指針,并沒有提供一個錯誤碼。但如果你將連接句柄作為一個變量,那么即使 mysql_real_connect 失敗,你仍然能夠處理它。
connect2.c
使用非動態分配的連接結構,以及編寫一些基本的錯誤處理代碼。
#include?
#include?
#include?"mysql.h"
intmain()
{
MYSQL?my_connection;
mysql_init(&my_connection);
if(mysql_real_connect(&my_connection,"localhost","wcdj","123","newdatabase",?0,?NULL,?0))
{
printf("Connection?success/n");
mysql_close(&my_connection);
}
else
{
fprintf(stderr,?"Connection?failed/n");
if(mysql_errno(&my_connection))
{
fprintf(stderr,?"Connection?error?%d:?%s/n",?mysql_errno(&my_connection),
mysql_error(&my_connection));
}
}
returnEXIT_SUCCESS;
}
編譯程序:
$ gcc -I/usr/include/mysql connect2.c -L/usr/lib/mysql -lmysqlclient -o connet2
假設當前沒有創建 newdatabase 這個數據庫,運行 connect2 將提示如下錯誤信息:
測試:
$ ./connect2
Connection failed
Connection error 1049: Unknown database 'newdatabase'
登錄mysql
$ mysql -u wcdj --password=123
創建一個新的數據庫newdatabase
mysql> CREATE DATABASE newdatabase;
退出wcdj用戶
mysql> /q
再此測試 connect2:
Connection success
修改 connect2.c 中的密碼 123 為一個錯誤的密碼,再測試會提示如下錯誤信息:
Connection failed
Connection error 1045: Access denied for user 'wcdj'@'localhost' (usig password: YES)
參考:
Linux 程序設計(第4版)第8章 P.283