與PostgreSQL相似
可使用許多不同的語言來訪問MySQL
包括C
C++
Java和Perl
從Professional Linux Programming中第
章有關MySQL的下列章節中
Neil Matthew和Richard Stones使用詳盡的MySQL C接口向我們介紹了如何在MySQL數據庫中執行SQL語句
他們將討論返回數據的語句
例如INSERT以及不返回數據的語句
例如UPDATE和DELETE
然後
他們將編寫從數據庫檢索數據的簡單程序
執行SQL語句 現在
我們已經有了一個連接
並且知道如何處理錯誤
是時候討論使用我們的數據庫來作一些實際工作了
執行所有類型的SQL的主關鍵字是mysql_query
int mysql_query(MYSQL *connection
const char *query)
正如您所見
它非常簡單
它取一個指向連接結構的指針和包含要執行的SQL的文本字符串
與命令行工具不同
將不使用結束分號
成功之後
返回
在需要包含二進制數據的特殊情況下
可以使用相關的函數
mysql_real_query
雖然出於本章的目的
我們僅需要討論mysql_query
不返回數據的SQL語句 我們將先討論UPDATE
DELETE和INSERT語句
因為它們不返回數據
所以更易於使用
這裡我們將介紹的另一個重要函數是檢查受影響的行數的函數
my_ulonglong mysql_affected_rows(MYSQL *connection);
可能關於這一函數的最顯而易見的事就是其非同尋常的返回結果
由於可移植性原因
這是一個特殊的無符號類型
為了在printf中使用
建議將其強制轉換成使用%lu格式規范的無符號長整數
這個函數返回受以前的UPDATE
INSERT或DELETE查詢影響的行數
這些查詢是使用mysql_query執行的
通常對於mysql_函數
返回碼
表示沒有行受影響
正數表示實際結果
通常是受影響的行數
如前所述
當使用mysql_affected_rows時可能出現未期望的結果
讓我們先討論受INSERT語句影響的行數
它將按預期進行操作
將下列代碼添加到程序 connect
c 中
並且稱其為insert
c
#include
#include
#include
mysql
h
int main(int argc
char *argv[]) {
MYSQL my_connection;
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection
localhost
rick
bar
rick
NULL
)) {
printf(
Connection success\n
);
res = mysql_query(&my_connection
INSERT INTO children(fname
age)
VALUES(
Ann
)
);
if (!res) {
printf(
Inserted %lu rows\n
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr
Insert error %d: s\n
mysql_errno
(&my_connection)
mysql_error(&my_connection));
}
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));
}
}
return EXIT_SUCCESS;
}
正如預期
插入的行數為
現在
我們更改代碼
所以
insert
部分被替換成
mysql_errno(&my_connection)
mysql_error(&my_connection));
}
}
res = mysql_query(&my_connection
UPDATE children SET AGE =
WHERE fname =
Ann
);
if (!res) {
printf(
Updated %lu rows\n
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr
Update error %d: %s\n
mysql_errno(&my_connection)
mysql_error(&my_connection));
}
現在假設子表中有的數據
如下
childno fname age
Jenny
Andrew
Gavin
Duncan
Emma
Alex
Adrian
Ann
Ann
Ann
Ann
如果我們執行update
希望報告的受影響行數為
但是實際上程序報告
因為它僅必須更改
行
雖然WHERE子句標識了
行
如果想讓mysql_affected_rows報告的結果為
這可能是熟悉其它數據庫的人所期望的)
則需要記住將CLIENT_FOUND_ROWS標志傳遞到mysql_real_connect
在 update
c中的程序如下
if (mysql_real_connect(&my_connection
localhost
rick
bar
rick
NULL
CLIENT_FOUND_ROWS)) {
如果我們在數據庫中復位數據
然後運行帶有這種修改的程序
則它報告的行數為
函數mysql_affected_rows還有最後一個奇怪之處
它發生在從數據庫中刪除數據時
如果使用WHERE子句
則mysql_affected_rows將按預期返回刪除行數
但是
如果沒有WHERE子句
則刪除所有行
報告受影響的行數卻為
這是因為由於效率原因優化刪除整個表
這種行為不受CLIENT_FOUND_ROWS選項標志的影響
返回數據的語句 現在是時候討論SQL的最普遍用法了
從數據庫檢索數據的SELECT語句
MySQL 還支持返回結果的SHOW
DESCRIBE和EXPLAIN SQL語句
但是這裡不考慮它們
按慣例
手冊中包含這些語句的說明
您將會從PostgreSQL章記起
可以從PQexec中的SQL SELECT 語句檢索數據
這裡馬上獲取所有數據
或者使用游標從數據庫中逐行檢索數據
以便搞定大數據
由於完全相同的原因
MySQL的檢索方法幾乎完全相同
雖然它實際上不用游標的形式描述逐行檢索
但是
它提供了縮小這兩種方法間差異的API
如果需要
它通常使兩種方法的互換更加容易
通常
從MySQL數據庫中檢索數據有
個階段
發出查詢
檢索數據
處理數據
執行所需的任何整理 象以前一樣
我們使用mysql_query發出查詢
數據檢索是使用mysql_store_result或mysql_use_result完成的
這取決於想如何檢索數據
隨後使用mysql_fetch_row調用序列來處理數據
最後
必須調用mysql_free_result以允許MySQL執行任何所需的整理
全部立即數據檢索的函數 可以從SELECT語句(或其他返回數據的語句)中檢索完所有數據
在單一調用中
使用mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *connection);
必須在mysql_query檢索數據後才能調用這個函數
以在結果集中存儲該數據
這個函數從服務器中檢索所有數據並立即將它存儲在客戶機中
它返回一個指向以前我們從未遇到過的結構(結果集結構)的指針
如果語句失敗
則返回NULL
使用等價的PostgreSQL時
應該知道返回NULL意味著已經發生了錯誤
並且這與未檢索到數據的情況不同
即使
返回值不是NULL
也不意味著當前有數據要處理
如果未返回NULL
則可以調用mysql_num_rows並且檢索實際返回的行數
它當然可能是
my_ulonglong mysql_num_rows(MYSQL_RES *result);
它從mysql_store_result取得返回的結果結構
並且在該結果集中返回行數
行數可能為
如果mysql_store_result成功
則mysql_num_rows也總是成功的
這種mysql_store_result和mysql_num_rows的組合是檢索數據的一種簡便並且直接的方法
一旦mysql_store_result成功返回
則所有查詢數據都已經存儲在客戶機上並且我們知道可以從結果結構中檢索它
而不用擔心會發生數據庫或網絡錯誤
因為對於程序所有數據都是本地的
還可以立即發現返回的行數
它可以使編碼更簡便
如前所述
它將所有結果立即地發送回客戶機
對於大結果集
它可能耗費大量的服務器
網絡和客戶機資源
由於這些原因
使用更大的數據集時
最好僅檢索需要的數據
不久
我們將討論如何使用mysql_use_result函數來完成該操作
一旦檢索了數據
則可以使用mysql_fetch_row來檢索它
並且使用mysql_data_seek
mysql_row_seek
mysql_row_tell操作結果集
在開始檢索數據階段之前
讓我們先討論一下這些函數
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
這個函數采用從存儲結果中獲取的結果結構
並且從中檢索單一行
在行結構中返回分配給您的數據
當沒有更多數據或者發生錯誤時
返回NULL
稍後
我們將回來處理這一行中的數據
void mysql_data_seek(MYSQL_RES *result
my_ulonglong offset);
這個函數允許您進入結果集
設置將由下一個獲取操作返回的行
offset是行號
它必須在從
到結果集中的行數減
的范圍內
傳遞
將導致在下一次調用mysql_fetch_row時返回第一行
MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *res
From:http://tw.wingwit.com/Article/program/MySQL/201311/29372.html