參考鏈接:https://www.mysqlzh.com/api/72.html
關于SQL的預處理介紹和優點不是本篇文章的重點,本篇主要介紹如何使用mysql C API提供的預處理函式,
從操作方式上來說,對資料庫的操作共分為兩類:
1.不帶回傳值的操作,如增、刪、改
2.帶回傳值的操作,如查詢,對于C API函式來說,使用上也有一點區別
事先準備:創建一張表,陳述句:
CREATE TABLE IF NOT EXISTS cameras(camera_id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,model INTEGER NOT NULL,width INTEGER NOT NULL,height INTEGER NOT NULL,params LONGBLOB,prior_focal_length INTEGER NOT NULL);
來看一下mysql提供的操作介面:
//插入操作,即沒有回傳結果集
MYSQL *conn=mysql_init(NULL);
mysql_real_connect(conn,ip,user,pass,db_name,port,NULL,0); //創建mysql連接
MYSQL_STMT* sql_stmt_add_camera_ = nullptr; //定義一個預處理物件
string sql = "INSERT INTO cameras(camera_id, model, width, height, params, "
"prior_focal_length) VALUES(?, ?, ?, ?, ?, ?);"; //定義插入表的sql陳述句,?為占位符,表示你要插入的值,必須這么寫
sql_stmt_add_camera_ = mysql_stmt_init(conn); /* 初始化預處理句柄*/
mysql_stmt_prepare(sql_stmt_add_camera_ , sql.c_str(), sql.length());/*準備字串操作指向的SQL陳述句*/
/*系結插入的引數,即替換掉sql陳述句中的?*/
int val = 1;
MYSQL_BIND params[6];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &val;
params[0].is_null = 0;
//依次系結6個引數
......
mysql_stmt_bind_param(sql_stmt_add_camera_, params) /* 系結傳入引數到預處理陳述句中*/
mysql_stmt_execute(sql_stmt_add_camera_) /* 執行與陳述句句柄相關的預處理操作*/
mysql_stmt_close(sql_stmt_add_camera_) /*關閉預處理句柄*/
對于查詢操作,即需要回傳結果集預處理操作,和上面的操作步驟基本相同,只是需要多呼叫一個mysql_stmt_bind_result()介面,將回傳結果集與定義的MYSQL_BIND陣列系結 ,查詢結果將會保存在MYSQL_BIND陣列中,代碼如下
//查詢操作,需要回傳結果集
MYSQL *conn=mysql_init(NULL);
mysql_real_connect(conn,ip,user,pass,db_name,port,NULL,0); //創建mysql連接
MYSQL_STMT* sql_stmt_query_camera_ = nullptr; //定義一個預處理物件
string sql = "select *from cameras;"; //定義插入表的sql陳述句,?為占位符,表示你要插入的值,必須這么寫
sql_stmt_query_camera_ = mysql_stmt_init(conn); /* 初始化預處理句柄*/
mysql_stmt_prepare(sql_stmt_query_camera_ , sql.c_str(), sql.length());/*準備字串操作指向的SQL陳述句*/
/*系結查詢的引數,如果查詢沒有條件可以不系結*/
MYSQL_BIND param[1];
memset(param, 0, sizeof(params));
/*系結查詢的結果*/
int val;
MYSQL_BIND result[6];
memset(result, 0, sizeof(result));
result[0].buffer_type = MYSQL_TYPE_LONG;
result[0].buffer = &val;
result[0].is_null = 0;
//查詢的第一個欄位值將會保存在val中
//依次系結6個引數
......
mysql_stmt_bind_result(sql_stmt_add_camera_, result) /* 系結傳入引數到預處理陳述句中*/
mysql_stmt_execute(sql_stmt_add_camera_) /* 執行與陳述句句柄相關的預處理操作*/
mysql_store_result(sql_stmt_add_camera_);
while(!mysql_stmt_fetch(stat)){ //按行回傳結果,結果保存在result中
}
mysql_stmt_close(sql_stmt_add_camera_) /*關閉預處理句柄*/
關于系結引數的型別:
| 型別 | 長度 |
| MYSQL_TYPE_TINY | 1 |
| MYSQL_TYPE_SHORT | 2 |
| MYSQL_TYPE_LONG | 4 |
| MYSQL_TYPE_LONGLONG | 8 |
| MYSQL_TYPE_FLOAT | 4 |
| MYSQL_TYPE_DOUBLE | 8 |
| MYSQL_TYPE_TIME | sizeof(MYSQL_TIME) |
| MYSQL_TYPE_DATE | sizeof(MYSQL_TIME) |
| MYSQL_TYPE_DATETIME | sizeof(MYSQL_TIME) |
| MYSQL_TYPE_STRING | data length |
| MYSQL_TYPE_BLOB | data_length |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/258076.html
標籤:其他
上一篇:常用資料庫jdbc連接池的配置(在spring中的配置)
下一篇:SQL練習43:將所有to_date為9999-01-01的全部更新為NULL,且 from_date更新為2001-01-01
