Mysql C語言API編程入門講解之詳細篇

來源:互聯網
上載者:User

軟體開發中我們經常要訪問資料庫,存取資料,之前已經有網友提出讓雞啄米講講資料庫編程的知識,本文就詳細講解如何使用Mysql的C語言API進行資料庫編程。

API,全稱Application Programming Interfaces,即API,我們可以調用這些介面,執行API函數提供的功能。

Mysql C語言API就是用C語言編寫的Mysql編程介面,使用這些介面函數可以實現對Mysql資料庫的查詢等操作。

Mysql的安裝

要進行Mysql編程首先要在充當Mysql伺服器的電腦和本機上都安裝Mysql,伺服器上的Mysql用來串連查詢,本機上的Mysql作為開 發之用,當然本機也可以兼顧伺服器和開發之用。下載Mysql可以到http://www.mysql.com/downloads/mysql/。雞啄 米安裝的是“Windows (x86, 64-bit), MSI Installer”版本。

在Mysql安裝過程中,安裝選項一定要選上Development Components下的Client C API library(shared),這樣才會將Mysql API的標頭檔和動態庫安裝到電腦中。

安裝完成後,我們編程要用的就是include目錄下的標頭檔和lib目錄下的庫檔案。

Mysql API資料結構

Mysql API中用到了很多結構體等資料類型,下面就簡單說說常用的幾個資料結構的含義,至於它們的定義雞啄米就不貼了,大家可以到Mysql提供的mysql.h標頭檔中查看。

MYSQL

串連資料庫前,必須先建立MYSQL變數,此變數在很多Mysql API函數會用到。它包含了一些串連資訊等資料。

MYSQL_RES

MYSQL_RES結構體中包含了查詢結果集,也就是從資料庫中查詢到的資料。可以使用mysql_store_result或mysql_use_result函數獲得。

MYSQL_ROW

MYSQL ROW的定義如下:

typedef char **MYSQL_ROW;

可見,它實際上是char **類型,指向一個字串數組。可以通過mysql_fetch_row函數獲得。

MYSQL_FIELD

MYSQL_FIELD中包含了欄位名、欄位類型和大小等資訊。可以重複調用mysql_fetch_field函數獲得所有欄位的資訊。

Mysql C API編程步驟

1、首先我們要包含mysql的標頭檔,並連結mysql動態庫。即添加以下語句:

#include <WinSock2.h> // 進行網路編程需要winsock2.h

#include <mysql.h>

#pragma comment(lib, “libmysql.lib”)

2、建立MYSQL變數。如:

MYSQL mysql;

3、初始化MYSQL變數。

mysql_init(&mysql);

4、調用mysql_real_connect函數串連Mysql資料庫。mysql_real_connect函數的原型如下:

MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);

參數說明:mysql--前面定義的MYSQL變數;host--MYSQL伺服器的地址;user--登入使用者名稱;passwd--登入密 碼;db--要串連的資料庫;port--MYSQL伺服器的TCP服務連接埠;unix_socket--unix串連方式,為NULL時表示不使用 socket或管道機制;clientflag--Mysql運行為ODBC資料庫的標記,一般取0。串連失敗時該函數返回0。

5、調用mysql_real_query函數進行資料庫查詢。mysql_real_query函數的原型如下:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

參數說明:mysql--前面定義的MYSQL變數;q--SQL查詢語句;length--查詢語句的長度。

查詢成功則該函數返回0。

6、通過調用mysql_store_result或mysql_use_result函數返回的MYSQL_RES變數擷取查詢結果資料。

兩個函數的原型分別為:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);

MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);

這兩個函數分別代表了擷取查詢結果的兩種方式。第一種,調用mysql_store_result函數將從Mysql伺服器查詢的所有資料都儲存到 用戶端,然後讀取;第二種,調用mysql_use_result初始化檢索,以便於後面一行一行的讀取結果集,而它本身並沒有從伺服器讀取任何資料,這 種方式較之第一種速度更快且所需記憶體更少,但它會綁定伺服器,阻止其他線程更新任何錶,而且必須重複執行mysql_fetch_row讀取資料,直至返 回NULL,否則未讀取的行會在下一次查詢時作為結果的一部分返回,故經常我們使用mysql_store_result。

7、調用mysql_fetch_row函數讀取結果集資料。

上述兩種方式最後都是重複調用mysql_fetch_row函數讀取資料。mysql_fetch_row函數的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

參數result就是mysql_store_result或mysql_use_result的傳回值。

該函數返回MYSQL_ROW型的變數,即字串數組,假設為row,則row[i]為第i個欄位的值。當到結果集尾部時,此函數返回NULL。

8、結果集用完後,調用mysql_free_result函數釋放結果集,以防記憶體泄露。mysql_free_result函數的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result);

9、不再查詢Mysql資料庫時,調用mysql_close函數關閉資料庫連接。mysql_close函數的原型為:

void STDCALL mysql_close(MYSQL *sock);

Mysql C API編程執行個體

這裡給大家一個簡單的Mysql API編程執行個體。使用VS2010編寫。訪問的資料庫為安裝Mysql後預設建立的名稱為“mysql”的資料庫,查詢其“user”表的資料,步驟如下:

1、建立一個Win32 Console Application(Win32控制台程式)的空工程(建立空工程需要在嚮導的Application Settings一步中,勾選Empty project),名稱就取為mysql。

2、在Solution Explorer視窗的工程名“mysql”上點右鍵,選擇“Properties”,彈出工程的屬性頁面,然後在左側子視窗中,選擇 Configuration Properties->VC++ Directories,右側子視窗中會顯示一些設定項列表,然後在Include Directories項中添加Mysql的Include目錄,在Library Directories項中添加Mysql的lib目錄。

3、建立一個cpp檔案,取名mysql.cpp。

4、在mysql.cpp檔案中包含mysql標頭檔並連結mysql動態庫。

#include <WinSock2.h>

#include <mysql.h>

#pragma comment(lib, “libmysql.lib”)

這裡要注意,因為mysql用到了網路連接的介面函數,所以需要在前麵包含WinSock2.h檔案。

同時本例中使用了輸出資料流cout,所以還要包含輸入輸出資料流標頭檔:

#include <iostream>

using namespace std;

5、建立main函數,並修改函數體如下:

int main()

{

MYSQL mysql;

MYSQL_RES *res;

MYSQL_ROW row;

// 初始化MYSQL變數

mysql_init(&mysql);

// 串連Mysql伺服器,本例使用本機作為伺服器。訪問的資料庫名稱為“msyql”,參數中的user為你的登入使用者名稱,***為登入密碼,需要根據你的實際使用者進行設定

if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0))

{

cout << “mysql_real_connect failure!” << endl;

return 0;

}

// 查詢mysql資料庫中的user表

if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))

{

cout << “mysql_real_query failure!” << endl;

return 0;

}

// 儲存結果集

res = mysql_store_result(&mysql);

if (NULL == res)

{

cout << “mysql_store_result failure!” << endl;

return 0;

}

// 重複讀取行,並輸出第一個欄位的值,直到row為NULL

while (row = mysql_fetch_row(res))

{

cout << row[0] << endl;

}

// 釋放結果集

mysql_free_result(res);

// 關閉Mysql串連

mysql_close(&mysql);

return 0;

}

6、將mysql安裝目錄中的libmysql.dll動態庫檔案拷貝到工程的目前的目錄,運行程式。

如果你跟雞啄米一樣使用的是mysql的64位版本,此時程式會報錯,有很多不能解析的符號,這是因為我們的工程是32位的,應該改為64位,方法 是,上面的工程屬性頁面的右上方有個Configuration Manager按鈕,點擊它彈出Configuration Manager對話方塊,下面的列表中可以看到有我們的工程,Platform列顯示為“Win32”:

這裡需要點擊右側的箭頭下拉,選擇New彈出New Project Platform對話方塊,New platform選擇x64建立新Platform:

上述的Platform列選擇x64就可以了。再次運行程式,你會發現它果然不報錯了。

本文就到這裡了,到此大家應該對Mysql C API編程有了基本的瞭解了,在實際開發中可以不斷深入研究。

文:雞啄米

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.