標籤:之間 nec data- strong [] 資料庫 class cti pos
8.3 使用C語言訪問MySQL資料8.3.3 運行SQL語句運行SQL語句的主要API函數被恰當的命名為:
int mysql_query(MYSQL *connection, const char *query);
這個常式
接受串連結構指標和文本字串形式的有效SQL語句,假設成功,它返回0.
1.不返回資料的SQL語句為簡單起見,先看一些不返回不論什麼資料的SQL語句:UPDATE,DELETE和INSERT.
以下的函數用於
檢查受查詢影響的行數:
my_ulonglong mysql_affected_rows(MYSQL *connection);
這個函數的返回值類型非常不常見,它使用無符號類型是出於移植性的考慮.當使用printf時,最好使用%lu格式將其轉換為無符號長整形.這個函數返回受之前啟動並執行UPDATE,DELETE和INSERT查詢影響的函數.MySQL返回的是被一個更新操作改動的行數.
通常對於mysql_系列函數,返回值0表示沒有行受到影響,正數則是實際的結果,一般表示受影響的行數.
編敲代碼insert1.c,嘗試在表中插入一個新行.
mysql_affected_rows返回實際對資料進行的改動或者插入的行數.此外當從資料庫中刪除資料時,假設使用WHERE子句刪除資料,那麼mysql_affected_rows將返回刪除的行數.但假設在DELETE語句中賣沒有WHERE子句,那麼表中的全部行都會被刪除,可是由程式返回的受影響的行數卻為0.這是由於MySQL最佳化了刪除全部行的操作,它並非運行很多個單行刪除操作.
2.發現插入的內容auto_increment類型由MySQL自己主動分配ID,這一特性很實用,特別是當有很多使用者的時候.
CREATE TABLE children(
childno int auto_increment NULL PRIMARY KEY,
fname varchar(30),
age int
);
MySQL提供函數
LAST_INSERT_ID()給出了auto_increment列的值.
不管何時MySQL向auto_increment列中插入資料,
MySQL都會基於每一個使用者對最後分配的值進行跟蹤.使用者程式能夠通過SELECT專用函數LAST_INSERT_ID()來發現該值,這個函數的作用有點像表中的虛擬列.
編敲代碼insert2.c
3.返回資料的語句SQL最常見的使用方法當然是提取資料而不是插入或更新資料.資料是使用SELECT語句提取的.
MySQL也支援使用SQL語句SHOW,DESCRIBE和EXPLAIN來返回結果,臨時不涉及它們.
在C應用程式中提取資料一般須要以下4個步驟:
執行查詢
提取資料
處理資料
必要的清理工作
就像之前的INSERT和DELETE語句一樣,將使用
mysql_query來發送SQL語句執行查詢,然後使用
mysql_store_result或mysql_use_result來提取資料,詳細使用哪個函數取決於想怎樣提取資料.接著將使用一系列
mysql_fetch_row調用來處理資料,最後使用
mysql_free_result釋放查詢佔用的記憶體資源.
mysql_use_result和mysql_store_result的差別主要在於,是想一次返回一行資料,還是一次返回全部的結果.當語句結果集較小時,後者比較合適.
一次提取全部資料的函數
能夠使用mysql_store_result在一次調用中從SELECT中提取全部資料:
MYSQL_RES *mysql_store_result(MYSQL *connection);
顯然,須要在成功調用mysql_query之後使用此函數.這個函數將
立馬儲存從client中返回的資料.它返回一個指向結果集結構的指標,假設失敗返回NULL.
my_ulonglong mysql_num_rows(MYSQL_RES *result);
這個函數接受由mysql_store_result返回的結果,並返回的結果結構,並返回結果集中的行數.假設mysql_store_result調用成功,mysql_num_rows將始終都是成功的.
假設使用的是一個特別龐大的資料集,那麼最好提取小一些,更easy管理的資訊塊,由於這將更快地將控制權返回給應用程式,而且不會佔用大量的網路資源.
使用mysql_fetch_row來處理它,也能夠使用mysql_data_seek,mysql_row_seek和mysql_row_tell在資料集中來回移動.
1.mysql_fetch_row:這個函數從使用mysql_store_result得到的結果中提取一行,並把它放到一個行結構中.當資料用完或錯誤發生時返回NULL.
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
2.mysql_data_seek:這個函數用來在結果集中進行跳轉,設定將被下一個mysql_fetch_row操作返回的行.參數offset的值是一個行號,它必須在0到結果集總行數減1的返回內.傳遞0將會導致下一個mysql_fetch_row調用返回結果集中的第一行.
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
3.mysql_row_tell:這個函數返回一個位移值,它用來表示結果集中的當前位置.它不是行號,不能將它用於mysql_data_seek.
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
可是能夠這樣使用它的返回值:
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
這將在結果集中移動當前位置,並返回之前的值.
這對函數對於結果集中的已知點之間的移動很實用.可是不要混淆由row_tell和row_seek使用的位移量和data_seek使用的行號.
4.完畢了對資料的全部操作之後,必須明白地調用
mysql_free_result來讓MySQL庫完畢善後處理.
提取資料
編敲代碼select1.c提取全部年齡大於5的記錄
#include <stdlib.h>#include <stdio.h>#include "mysql.h"int main(int argc, char *argv[]){int res;MYSQL my_connection;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;mysql_init(&my_connection);//初始化串連控制代碼,返回一個指向新分配的串連控制代碼的指標,僅僅是分配和初始化了一個結構if (mysql_real_connect(&my_connection, "localhost", "rick","secret", "foo", 0, NULL, 0)){//mysql_real_connect向一個串連提供參數,指標connection指向已經被mysql_init初始化過的結構printf("Connection success\n");res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");//mysql_query參數為結構指標和文本字串形式的SQL語句,假設成功則運行字串表示的SQL語句,返回0if (res){printf("SELECT error: %s\n", mysql_error(&my_connection));}else{res_ptr = mysql_store_result(&my_connection);//mysql_store_result在一次調用中從SELECT中提取全部資料,返回指向結果集結構的指標if (res_ptr){printf("Retrieved %lu rows\n", (unsigned long)mysql_num_rows(res_ptr));//mysql_num_rows得到返回記錄的數目,接受由mysql_store_result返回的結果結構指標while((sqlrow = mysql_fetch_row(res_ptr))){//mysql_fetch_row從mysql_store_result的結果結構中提取一行printf("Fetched data...\n");}if (mysql_errno(&my_connection)){//mysql_errno返回錯誤碼,非零fprintf(stderr, "Retrieve error: %s\n", mysql_error(&my_connection));//mysql_error返回錯誤的文本資訊}mysql_free_result(res_ptr);//mysql_free_result釋放查詢佔用的記憶體資源}}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;}
linux程式設計——運行SQL語句(第八章)