mysqlapi的原理及用法是什么

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

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了常州免費(fèi)建站歡迎大家使用!

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)說過,這兒就不在細(xì)說
連接參數(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()不能用于包含二進(jìn)制數(shù)據(jù)的查詢,應(yīng)使用mysql_real_query()取而代之(二進(jìn)制數(shù)據(jù)可能包含字符‘\0’,mysql_query()會將該字符解釋為查詢字符串結(jié)束)。
如果希望了解查詢是否應(yīng)返回結(jié)果集,可使用mysql_field_count()進(jìn)行檢查
對于操縱語句
?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é)果集實(shí)際讀取到客戶端。它必須通過對mysql_fetch_row()的調(diào)用,對每一行分別進(jìn)行檢索。
?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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站標(biāo)題:mysqlapi的原理及用法是什么
標(biāo)題鏈接:http://bm7419.com/article4/gegeoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、全網(wǎng)營銷推廣、網(wǎng)站營銷網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)