国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Linux下C語言執行MySQL語句_MySQL

來源:懂視網 責編:小采 時間:2020-11-09 18:51:06
文檔

Linux下C語言執行MySQL語句_MySQL

Linux下C語言執行MySQL語句_MySQL:bitsCN.com 執行SQL語句的增、刪、改、查的主要API函數為:int mysql_query(MYSQL *connection, const char *query);函數接收參數連接句柄和字符串形式的有效SQL語句(沒有結束的分號,這與mysql工具不同)。如果成功,它返回0。如果包含二進制數據的查
推薦度:
導讀Linux下C語言執行MySQL語句_MySQL:bitsCN.com 執行SQL語句的增、刪、改、查的主要API函數為:int mysql_query(MYSQL *connection, const char *query);函數接收參數連接句柄和字符串形式的有效SQL語句(沒有結束的分號,這與mysql工具不同)。如果成功,它返回0。如果包含二進制數據的查
bitsCN.com

執行SQL語句的增、刪、改、查的主要API函數為:

int mysql_query(MYSQL *connection, const char *query);

函數接收參數連接句柄和字符串形式的有效SQL語句(沒有結束的分號,這與mysql工具不同)。如果成功,它返回0。

如果包含二進制數據的查詢,要使用mysql_real_query.

檢查受查詢影響的行數:

my_ulonglong mysql_affected_rows(MYSQL *connection);
my_ulonglong是無符號長整形,為%lu格式
這個函數返回受之前執行update,insert或delete查詢影響的行數。

例子

數據庫中有一個student表

CREATE TABLE student (	student_no varchar(12) NOT NULL PRIMARY KEY,	student_name varchar(12) NOT NULL	); 
/

增、刪、改代碼:

#include #include #include #include "mysql.h"#include "errmsg.h"#include "mysqld_error.h"MYSQL conn;void connection(const char* host, const char* user, const char* password, const char* database) {	mysql_init(&conn); // 注意取地址符&	if (mysql_real_connect(&conn, host, user, password, database, 0, NULL, 0)) {	printf("Connection success!/n");	} else {	fprintf(stderr, "Connection failed!/n");	if (mysql_errno(&conn)) {	fprintf(stderr, "Connection error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}	exit(EXIT_FAILURE);	}}void insert() {	int res = mysql_query(&conn, "INSERT INTO student(student_no,student_name) VALUES('123465', 'Ann')");	if (!res) {	printf("Inserted %lu rows/n", (unsigned long)mysql_affected_rows(&conn));	} else {	fprintf(stderr, "Insert error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}}void update() {	int res = mysql_query(&conn, "UPDATE student SET student_name='Anna' WHERE student_no='123465'");	if (!res) {	printf("Update %lu rows/n", (unsigned long)mysql_affected_rows(&conn));	} else {	fprintf(stderr, "Update error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}}void delete() {	int res = mysql_query(&conn, "DELETE from student WHERE student_no='123465'");	if (!res) {	printf("Delete %lu rows/n", (unsigned long)mysql_affected_rows(&conn));	} else {	fprintf(stderr, "Delete error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}}int main (int argc, char *argv[]) {	connection("localhost", "root", "shuang", "shuangde");	delete();	mysql_close(&conn);	exit(EXIT_SUCCESS);}

返回數據的語句:select

SQL最常見的用法是提取數據而不是插入或更新數據。數據是用select語句提取的

C應用程序提取數據一般需要4個步驟:

1、執行查詢

2、提取數據

3、處理數據

4、必要的清理工作

就像之前的insert和update一樣,使用mysql_query來發送SQL語句,然后使用mysql_store_result或mysql_use_result來提取數據,具體使用哪個語句取決于你想如何提取數據。接著,將使用一系列mysql_fetch_row來處理數據。最后,使用mysql_free_result釋放查詢占用的內存資源。

一次提取所有數據:mysql_store_result

// 相關函數:// 這是在成功調用mysql_query之后使用此函數,這個函數將立刻保存在客戶端中返回的所有數據。它返回一個指向結果集結構的指針,如果失敗返回NULLMYSQL_RES *mysql_store_result(MYSQL *connection);// 這個函數接受由mysql_store_result返回的結果結構集,并返回結構集中的行數my_ulonglong mysql_num_rows(MYSQL_RES *result);// 這個函數從使用mysql_store_result得到的結果結構中提取一行,并把它放到一個行結構中。當數據用完或發生錯誤時返回NULL.MYSQL_ROW mysql_fetch_row(MYSQL_RES *resutl);// 這個函數用來在結果集中跳轉,設置將會被下一個mysql_fetch_row操作返回的行。參數offset是一個行號,它必須是在0~結果總行數-1的范圍內。傳遞// 0將會導致下一個mysql_fetch_row調用返回結果集中的第一行。void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);// 返回一個偏移值,它用來表示結果集中的當前位置。它不是行號,不能把它用于mysql_data_seekMYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);// 這將在結果集中移動當前的位置,并返回之前的位置MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);// 完成所有對數據的操作后,必須總是調用這個來善后處理void mysql_free_result(MYSQL_RES *result);

示例代碼:

#include #include #include #include "mysql.h"#include "errmsg.h"#include "mysqld_error.h"MYSQL conn;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;void connection(const char* host, const char* user, const char* password, const char* database) {	mysql_init(&conn); // 注意取地址符&	if (mysql_real_connect(&conn, host, user, password, database, 0, NULL, 0)) {	printf("Connection success!/n");	} else {	fprintf(stderr, "Connection failed!/n");	if (mysql_errno(&conn)) {	fprintf(stderr, "Connection error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}	exit(EXIT_FAILURE);	}}int main (int argc, char *argv[]) {	connection("localhost", "root", "shuang", "shuangde");	int res = mysql_query(&conn, "SELECT * from student");	if (res) {	fprintf(stderr, "SELECT error: %s/n", mysql_error(&conn));	} else {	res_ptr = mysql_store_result(&conn);	if (res_ptr) {	printf("Retrieved %lu rows/n", (unsigned long)mysql_num_rows(res_ptr));	while ((sqlrow = mysql_fetch_row(res_ptr))) {	printf("Fetched data.../n")	;	}	if (mysql_errno(&conn)) {	fprintf(stderr, "Retrive error: %s/n", mysql_error(&conn));	}	mysql_free_result(res_ptr);	} 	}	mysql_close(&conn);	exit(EXIT_SUCCESS);}

一次提取一行數據:mysql_use_result

使用方法和mysql_store_result完全一樣,把上面代碼的mysql_store_result改為mysql_use_result即可。

mysql_use_result具備資源管理方面的實質性好處,更好地平衡了網絡負載,以及減少了可能非常大的數據帶來的存儲開銷,但是不能與mysql_data_seek、mysql_row_seek、mysql_row_tell、mysql_num_rows一起使用。如果數據比較少,用mysql_store_result更好。

處理返回的數據

// 相關函數和定義:// 返回結果集中的字段(列)數目unsigned int mysql_field_count(MYSQL *connection);// 將元數據和數據提取到一個新的結構中MYSQL_FIELD *mysql_fetch_field(MYSQL *result);// 這個函數用來覆蓋當前的字段編號,該編號會隨著每次mysql_fetch_field調用而自動增加。如果給offset傳遞0,那么將跳回第1列MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL *result, MYSQL_FIELD_OFFSET offset);// MYSQL_FIELD定義在sql.h中,是指向字段結構數據的指針,有關于列的信息。有成員:char *name;	// 列名,為字符串char *table;	// 列所屬表名char *def;	// 如果調用mysql_list_fields,它將包含該列的默認值enum enum_field_types type; // 列類型unsigned int length;	 // 列寬unsigned int max_length;	 // 如果使用mysql_store_result,它將包含以字節為單位的提取的最長列值的長度,如果使用mysql_use_result,將不會被設置unsigned int flags;	 // 關于列定義的標志,與得到的數據無關.常見的標志的含義有:	 //	NOT_NULL_FLAG	 // PRI_KEY_FLAG	 //	UNSIGNED_FLAG	 // AUTO_INCREMENT_FLAG	 // BINARY_FLAG等unsigned int decimals;	 // 小數點后的數字個數。// 列類型相當廣泛,完整的列表見頭文件mysql_com.h,常見的有://	FIELD_TYPE_DECIMAL//	FIELD_TYPE_LONG//	FIELD_TYPE_STRING//	FIELD_TYPE_VAR_STRING//一個特別有用的預定義宏: IS_NUM,當字段類型為數字時,返回true

代碼示例:

#include #include #include #include "mysql.h"#include "errmsg.h"#include "mysqld_error.h"MYSQL conn;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;void connection(const char* host, const char* user, const char* password, const char* database) {	mysql_init(&conn); // 注意取地址符&	if (mysql_real_connect(&conn, host, user, password, database, 0, NULL, 0)) {	printf("Connection success!/n");	} else {	fprintf(stderr, "Connection failed!/n");	if (mysql_errno(&conn)) {	fprintf(stderr, "Connection error %d: %s/n", mysql_errno(&conn), mysql_error(&conn));	}	exit(EXIT_FAILURE);	}}void display_row() {	unsigned int field_count = mysql_field_count(&conn);	int i = 0;	while (i < field_count) {	if (sqlrow[i]) printf("%s ", sqlrow[i]);	else printf("NULL");	i++;	}	printf("/n");}void display_header() {	MYSQL_FIELD *field_ptr;	printf("Column details:/n");	while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) {	printf("/t Name: %s/n", field_ptr->name);	printf("/t Table: %s/n", field_ptr->table);	printf("/t Type: ");	if (IS_NUM(field_ptr->type)) {	printf("Numeric field/n");	} else {	switch(field_ptr->type) {	case FIELD_TYPE_VAR_STRING:	printf("VARCHAR/n");	break;	case FIELD_TYPE_LONG:	printf("LONG");	break;	default:	printf("Type is %d, check in msyql_com.h/n", field_ptr->type);	}	}	printf("/t Max width %ld/n", field_ptr->length);	if (field_ptr->flags & AUTO_INCREMENT_FLAG)	printf("/t Auto increments/n");	printf("/n");	}}int main (int argc, char *argv[]) {	connection("localhost", "root", "shuang", "shuangde");	int res = mysql_query(&conn, "SELECT * from student");	if (res) {	fprintf(stderr, "SELECT error: %s/n", mysql_error(&conn));	} else {	res_ptr = mysql_use_result(&conn);	if (res_ptr) {	int first = 1;	while ((sqlrow = mysql_fetch_row(res_ptr))) {	if (first) {	display_header();	first = 0;	}	display_row();	}	if (mysql_errno(&conn)) {	fprintf(stderr, "Retrive error: %s/n", mysql_error(&conn));	}	mysql_free_result(res_ptr);	} 	}	mysql_close(&conn);	exit(EXIT_SUCCESS);}
bitsCN.com

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Linux下C語言執行MySQL語句_MySQL

Linux下C語言執行MySQL語句_MySQL:bitsCN.com 執行SQL語句的增、刪、改、查的主要API函數為:int mysql_query(MYSQL *connection, const char *query);函數接收參數連接句柄和字符串形式的有效SQL語句(沒有結束的分號,這與mysql工具不同)。如果成功,它返回0。如果包含二進制數據的查
推薦度:
標簽: cc linux mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 五月婷婷丁香 | 在线观看视频一区 | 精品亚洲一区二区三区 | 国产精品久久久久久久免费 | 国产欧美在线视频免费 | 91色老99久久九九爱精品 | 国产不卡一区二区三区免费视 | 7777精品伊人久久久大香线蕉 | 成人中文字幕一区二区三区 | 亚洲精品二三区伊人久久 | 久久免费看视频 | 九九精品免视看国产成人 | 国产一级一级一级成人毛片 | 精品一区二区三区五区六区七区 | 精品偷自拍另类在线观看 | 精品一区二区三区亚洲 | 国产高清美女一级a毛片久久 | 国产欧美日韩亚洲 | 国产成人久久久精品一区二区三区 | 韩日免费视频 | 亚洲欧美日韩专区 | 亚洲高清毛片 | 91一区二区三区 | 国产精品亚洲一区二区三区久久 | 国产欧美日韩另类va在线 | 国产成人成人一区二区 | 亚洲第一视频网站 | 欧美一区二区三区在线播放 | 欧美综合在线视频 | 亚洲精品99久久久久中文字幕 | 国产一区三区二区中文在线 | 日韩在线视频线视频免费网站 | 欧美一区二区三区视频在线观看 | 成人看免费一级毛片 | 国产在线一区二区 | 成人在线一区二区三区 | 日韩a在线观看免费观看 | 91在线精品亚洲一区二区 | 国产青草视频在线观看 | 91精品成人免费国产片 | 国产全部视频在线播放 |