linux程式設計——運行SQL語句(第八章)

來源:互聯網
上載者:User

標籤:之間   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語句(第八章)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.