溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql api的原理及用法是什么

發(fā)布時間:2021-11-17 16:11:38 來源:億速云 閱讀:107 作者:柒染 欄目:軟件技術(shù)

mysql api的原理及用法是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

mysql api

數(shù)據(jù)類型
?MYSQL
?該結(jié)構(gòu)代表1個數(shù)據(jù)庫連接的句柄。幾乎所有的MYSQL函數(shù)均使用它。
?MYSQL_RES
?該結(jié)構(gòu)代表返回行的查詢結(jié)果
?MYSQL_ROW
?這是1行數(shù)據(jù)的”類型安全”表示。
?MYSQL_FIELD
?該結(jié)構(gòu)包含關(guān)于字段的信息,如字段名、類型和大小等
?MYSQL_FIELD_OFFSET
?這時MYSQL字段列表偏移量的”類型安全”表示
?my_ulonglong
?用于行數(shù)以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的類型

編程步驟
?1  通過調(diào)用mysql_library_init(),初始化MYSQL庫(此步驟一般不用)
?2  通過調(diào)用mysql_init()初始化連接處理程序,并通過調(diào)用mysql_real_connect()連接到服務(wù)器
?3  發(fā)出SQL語句并處理其結(jié)果mysql_query()
注意: (1) 對于成功檢索了數(shù)據(jù)的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須調(diào)用mysql_store_result()或mysql_use_result() 。即查詢需用到上面的函數(shù)處理
(2)釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結(jié)果集分配的內(nèi)存。完成對結(jié)果集的操作后,必須調(diào)用mysql_free_result()釋放結(jié)果集使用的內(nèi)存。
?4  通過調(diào)用mysql_close(),關(guān)閉與MYSQL服務(wù)器的連接
?5  通過調(diào)用mysql_library_end(),結(jié)束MYSQL庫的使用(如果第一步省略,這一步可以省略)

數(shù)據(jù)庫連接
?初始化一個連接句柄結(jié)構(gòu)
#include <mysql.h>
MYSQL mysql_init(MYSQL );
?和數(shù)據(jù)庫建立物理連接
MYSQL mysql_real_connect(MYSQL connection,
const char server_host,const char sql_user_name,
const char sql_password,const char db_name,
unsigned int port_number,const char  
unix_socket_name,unsigned int flags);//此函數(shù)前面已經(jīng)說過,這兒就不在細說
連接參數(shù)
int mysql_options(MYSQL
mysql, enum mysql_option option, const char *arg)

可用于設(shè)置額外的連接選項,并影響連接的行為。可多次調(diào)用該函數(shù)來設(shè)置數(shù)個選項。

應(yīng)在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前調(diào)用mysql_options()。

選項參量指的是你打算設(shè)置的選項。Arg參量是選項的值。如果選項是整數(shù),那么arg應(yīng)指向整數(shù)的值。
可能的選項值:
MYSQL_READ_DEFAULT_GROUP         char *
從my.cnf或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名組讀取選項。
//此函數(shù)可以在用到時再去查手冊

錯誤處理
?unsigned int mysql_errno(MYSQL connection);
對于由mysql指定的連接,該函數(shù)返回最近調(diào)用的API函數(shù)的錯誤代碼,該函數(shù)調(diào)用可能成功也可能失敗。”0”返回值表示未出現(xiàn)錯誤
?char
mysql_error(MYSQL *connection)
如果想獲得錯誤的文本信息,可以調(diào)用該函數(shù)

執(zhí)行SQL語句

?int mysql_query(MYSQL mysql,const char query)
?功能描述:
?執(zhí)行由“Null終結(jié)的字符串”查詢指向的SQL查詢。正常情況下,字符串必須包含1條SQL語句,而且不應(yīng)為語句添加終結(jié)分號(‘;’)或“\g”。如果允許多語句執(zhí)行,字符串可包含多條由分號隔開的語句
mysql_query()不能用于包含二進制數(shù)據(jù)的查詢,應(yīng)使用mysql_real_query()取而代之(二進制數(shù)據(jù)可能包含字符‘\0’,mysql_query()會將該字符解釋為查詢字符串結(jié)束)。
如果希望了解查詢是否應(yīng)返回結(jié)果集,可使用mysql_field_count()進行檢查
對于操縱語句
?My_ulonglong mysql_affected_rows(MYSQL *mysql)
返回上次操縱語句所涉及到記錄的行數(shù)
?對于UPDATE、DELETE或INSERT語句,可在mysql_query()后立刻調(diào)用。對于SELECT語句,該函數(shù)的工作方式與mysql_num_rows()類似

對于查詢語言
?MYSQL_RES mysql_store_result(MYSQL mysql)
?功能說明:
?對于成功檢索了數(shù)據(jù)的每個查詢,必須調(diào)用mysql_store_result()或mysql_use_result()
?該函數(shù)將查詢的全部結(jié)果讀取到客戶端,分配1個MYSQL_RES結(jié)構(gòu),并將結(jié)果置于該結(jié)構(gòu)中
?可以通過mysql_num_rows來找出結(jié)果集中的行數(shù)

處理結(jié)果集
?MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
?功能描述
檢索結(jié)果集的下一行。在mysql_store_result()之后使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用時,如果沒有要檢索的行或出現(xiàn)了錯誤,mysql_fetch_row()返回NULL。

行內(nèi)值的數(shù)目由mysql_num_fields(result)給出。如果行中保存了調(diào)用mysql_fetch_row()返回的值,將按照row[0]到row[mysql_num_fields(result)-1],訪問這些值的指針。行中的NULL值由NULL指針指明。
可以通過調(diào)用mysql_fetch_lengths()來獲得行中字段值的長度。對于空字段以及包含NULL的字段,長度為0。通過檢查字段值的指針,能夠區(qū)分它們。如果指針為NULL,字段為NULL,否則字段為空。
返回值
下一行的MYSQL_ROW結(jié)構(gòu)。如果沒有更多要檢索的行或出現(xiàn)了錯誤,返回NULL
每次接收一行數(shù)據(jù)
?MYSQL_RES mysql_use_result(MYSQL mysql)
?功能說明:
?不像mysql_store_result()那樣把結(jié)果集實際讀取到客戶端。它必須通過對mysql_fetch_row()的調(diào)用,對每一行分別進行檢索。
?mysql_store_result()相比,速度更快而且使用的內(nèi)存更少

說明一下:mysql_store_result與mysql_use_result區(qū)別
mysql_store_result 會把數(shù)據(jù)庫的數(shù)據(jù)緩存到本地,下次通過mysql_fetch_row從本地緩存中去讀數(shù)據(jù),而mysql_use_result只是建立了一個到數(shù)據(jù)庫的鏈接,并沒有緩存數(shù)據(jù)庫數(shù)據(jù),通過調(diào)用mysql_fetch_row每次都是從數(shù)據(jù)庫去讀數(shù)據(jù)
對于少量數(shù)據(jù)當(dāng)然mysql_store_result效率更高,大量數(shù)據(jù)對的話最好用mysql_use_resut效率更高

    看了這么久的api 怎么用呢?
    請看下面的代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

////unsigned int mysql_errno(MYSQL *mysql)
int main()
{

int     ret = 0;

MYSQL   mysql;
MYSQL   *connect = NULL;
connect = mysql_init(&mysql) ;
if (connect == NULL)
{
    ret =  mysql_errno(&mysql) ;
    printf("func mysql_init() err \n");
    return ret;
}
printf("func mysql_init() ok \n");
connect = mysql_real_connect(connect, "localhost", "root", "mysql", "pos", 0, NULL, 0);
if (connect == NULL)
{
    ret =  mysql_errno(&mysql) ;
    printf("func mysql_init() err \n");
    return ret; 
}
printf("func mysql_real_connect() ok \n");

//查詢
const char *query = "select *from product";
ret = mysql_query(&mysql, query);
if (ret != 0)
{
    ret =  mysql_errno(&mysql) ;
    printf("func mysql_query() err \n");
    return ret; 
}

//typedef char ** MYSQL_ROW;               /* return data as array of strings */
//typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */

//獲取結(jié)果集合 
//結(jié)果集合中 可以含有10行數(shù)據(jù)
MYSQL_RES *result = mysql_store_result(&mysql);

MYSQL_ROW row = NULL;
while (row = mysql_fetch_row(result) ) 
{
    //  如何 獲取 selct查詢 有多少列?
    // 獲取表頭的函數(shù)? ...
    printf("%s, %s, %s, %s, %s, %s, %s, %s \n", row[0], row[1],row[2],row[3],row[4],row[5],row[6],row[7]);
}

mysql_free_result(result);
mysql_close(&mysql);
printf("hello...\n");
return ret;

}

看到這兒是否對MYSQL_ROW很暈?zāi)??下面說一下他的原型,你就知道了
請看下面的模型
//二級指針 三種內(nèi)存模型

//二級指針 從分配內(nèi)存的 角度 輸入和輸出...

//typedef char * MYSQL_ROW;               / return data as array of strings */
可以看到MYSQL_ROW 是一個二級指針

大概的原型如下
/*
char * mysql_fetch_row(MYSQL_RES res)
{
int i = 0;
char p = (char ) malloc(sizeof(char )   7);//分配空間,假設(shè)有7列
for (i=0; i<7 ; i++)
{
p[i] = (char )malloc(100sizeof(char) );//再為每一列分配空間
strcpy(p[i], "aaaaaa") ;//拷貝數(shù)據(jù)庫這列數(shù)據(jù)
}
return p;
}
另外一種改造:
int  mysql_fetch_row(MYSQLRES *res, char *myp)
{
int i = 0;
char
p = (char *) malloc(sizeof(char )   7);
for (i=0; i<7 ; i++)
{
p[i] = (char
)malloc(100*sizeof(char) )
;
strcpy(p[i], "aaaaaa") ;
}
myp = p;
}
/

//  如何 獲取 selct查詢 有多少列?
// 獲取表頭的函數(shù)?

看完上述內(nèi)容,你們掌握mysql api的原理及用法是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI