亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

mysql api的原理及用法是什么

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

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

mysql api

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

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

數據庫連接
?初始化一個連接句柄結構
#include <mysql.h>
MYSQL mysql_init(MYSQL );
?和數據庫建立物理連接
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);//此函數前面已經說過,這兒就不在細說
連接參數
int mysql_options(MYSQL
mysql, enum mysql_option option, const char *arg)

可用于設置額外的連接選項,并影響連接的行為。可多次調用該函數來設置數個選項。

應在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前調用mysql_options()。

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

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

執行SQL語句

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

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

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

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

說明一下:mysql_store_result與mysql_use_result區別
mysql_store_result 會把數據庫的數據緩存到本地,下次通過mysql_fetch_row從本地緩存中去讀數據,而mysql_use_result只是建立了一個到數據庫的鏈接,并沒有緩存數據庫數據,通過調用mysql_fetch_row每次都是從數據庫去讀數據
對于少量數據當然mysql_store_result效率更高,大量數據對的話最好用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 */

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

MYSQL_ROW row = NULL;
while (row = mysql_fetch_row(result) ) 
{
    //  如何 獲取 selct查詢 有多少列?
    // 獲取表頭的函數? ...
    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很暈呢?下面說一下他的原型,你就知道了
請看下面的模型
//二級指針 三種內存模型

//二級指針 從分配內存的 角度 輸入和輸出...

//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);//分配空間,假設有7列
for (i=0; i<7 ; i++)
{
p[i] = (char )malloc(100sizeof(char) );//再為每一列分配空間
strcpy(p[i], "aaaaaa") ;//拷貝數據庫這列數據
}
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查詢 有多少列?
// 獲取表頭的函數?

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临湘市| 廊坊市| 青田县| 宜阳县| 莱西市| 依兰县| 班玛县| 罗江县| 辉南县| 五大连池市| 册亨县| 屏南县| 班戈县| 黑龙江省| 兴文县| 栾川县| 类乌齐县| 沭阳县| 湘潭市| 科尔| 邳州市| 宜宾市| 蒙自县| 米泉市| 若羌县| 元谋县| 景洪市| 梧州市| 黔江区| 连江县| 大丰市| 牡丹江市| 衡水市| 延长县| 宜昌市| 漳平市| 镇沅| 南雄市| 灵丘县| 南充市| 绥滨县|