目次
例子
增、删、改代码:
返回数据的语句:select
一次提取所有数据:mysql_store_result
一次提取一行数据:mysql_use_result
处理返回的数据
代码示例:
ホームページ データベース mysql チュートリアル Linux下C语言执行MySQL语句_MySQL

Linux下C语言执行MySQL语句_MySQL

Jun 01, 2016 pm 01:26 PM
C言語 linux mysql

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 <stdio.h>#include <stdlib.h>#include <string.h>#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(&#39;123465&#39;, &#39;Ann&#39;)");	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=&#39;Anna&#39; WHERE student_no=&#39;123465&#39;");	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=&#39;123465&#39;");	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 <stdio.h>#include <stdlib.h>#include <string.h>#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 <stdio.h>#include <stdlib.h>#include <string.h>#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
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語データ構造:ツリーとグラフのデータ表現と操作 C言語データ構造:ツリーとグラフのデータ表現と操作 Apr 04, 2025 am 11:18 AM

C言語データ構造:ツリーとグラフのデータ表現は、ノードからなる階層データ構造です。各ノードには、データ要素と子ノードへのポインターが含まれています。バイナリツリーは特別なタイプの木です。各ノードには、最大2つの子ノードがあります。データは、structreenode {intdata; structreenode*left; structreenode*右;}を表します。操作は、ツリートラバーサルツリー(前向き、順序、および後期)を作成します。検索ツリー挿入ノード削除ノードグラフは、要素が頂点であるデータ構造のコレクションであり、近隣を表す右または未照明のデータを持つエッジを介して接続できます。

C言語ファイルの操作問題の背後にある真実 C言語ファイルの操作問題の背後にある真実 Apr 04, 2025 am 11:24 AM

ファイルの操作の問題に関する真実:ファイルの開きが失敗しました:不十分な権限、間違ったパス、およびファイルが占有されます。データの書き込みが失敗しました:バッファーがいっぱいで、ファイルは書き込みできず、ディスクスペースが不十分です。その他のFAQ:遅いファイルトラバーサル、誤ったテキストファイルエンコード、およびバイナリファイルの読み取りエラー。

C言語でカウントダウンを出力する方法 C言語でカウントダウンを出力する方法 Apr 04, 2025 am 08:54 AM

Cのカウントダウンを出力する方法は?回答:ループステートメントを使用します。手順:1。変数nを定義し、カウントダウン数を出力に保存します。 2。whileループを使用して、nが1未満になるまでnを連続的に印刷します。 3。ループ本体で、nの値を印刷します。 4。ループの端で、n x 1を減算して、次の小さな相互に出力します。

C言語関数の返品値の種類は何ですか? C言語関数の返品値のタイプの概要? C言語関数の返品値の種類は何ですか? C言語関数の返品値のタイプの概要? Apr 03, 2025 pm 11:18 PM

c言語関数の返品値タイプには、int、float、double、char、void、およびポインタータイプが含まれます。 intは整数を返すために使用され、フロートとダブルはフロートを返すために使用され、charは文字を返します。 voidとは、関数が値を返さないことを意味します。ポインタータイプはメモリアドレスを返し、メモリの漏れを避けるように注意してください。構造またはコンソーシアムは、複数の関連データを返すことができます。

C言語関数の概念とその定義形式 C言語関数の概念とその定義形式 Apr 03, 2025 pm 11:33 PM

C言語関数は、再利用可能なコードブロック、処理のパラメーターを受信し、結果を返すことです。それはスイスの陸軍ナイフに似ており、強力であり、慎重に使用する必要があります。関数には、形式の定義、パラメーター、戻り値、関数体などの要素が含まれます。高度な使用には、関数ポインター、再帰関数、コールバック関数が含まれます。一般的なエラーはタイプの不一致であり、プロトタイプの宣言を忘れています。デバッグスキルには、変数の印刷とデバッガーの使用が含まれます。パフォーマンス最適化は、インライン関数を使用します。関数設計は、単一の責任の原則に従う必要があります。 C言語関数の習熟度は、プログラミングの効率とコードの品質を大幅に向上させることができます。

CSウィーク3 CSウィーク3 Apr 04, 2025 am 06:06 AM

アルゴリズムは、問題を解決するための一連の指示であり、その実行速度とメモリの使用量はさまざまです。プログラミングでは、多くのアルゴリズムがデータ検索とソートに基づいています。この記事では、いくつかのデータ取得およびソートアルゴリズムを紹介します。線形検索では、配列[20,500,10,5,100,1,50]があることを前提としており、数50を見つける必要があります。線形検索アルゴリズムは、ターゲット値が見つかるまで、または完全な配列が見られるまで配列の各要素を1つずつチェックします。アルゴリズムのフローチャートは次のとおりです。線形検索の擬似コードは次のとおりです。各要素を確認します:ターゲット値が見つかった場合:return true return false c言語実装:#include#includeintmain(void){i

C言語関数における最大の一般的な除数を表現する方法に関するチュートリアル C言語関数における最大の一般的な除数を表現する方法に関するチュートリアル Apr 03, 2025 pm 11:21 PM

C言語で効率的かつエレガントに最大の一般的な除数を見つける方法:フェーズ分割を使用して、残りが0になるまで残りを絶えず分割することで解決します。2つの実装方法が提供されます:再帰と反復は簡潔で明確であり、反復実装はより高く、より安定しています。負の数と0を処理することに注意し、パフォーマンスの最適化を検討しますが、フェーズ分割自体は十分に効率的です。

c言語関数ポインターを返品値として使用する方法 c言語関数ポインターを返品値として使用する方法 Apr 03, 2025 pm 11:42 PM

関数ポインターは、異なる入力に従って異なる関数を返すメカニズムを実装するための戻り値として使用できます。関数タイプを定義し、選択に応じて対応する関数ポインターを返すことにより、動的に関数を呼び出して、コードの柔軟性を向上させることができます。ただし、関数ポインタータイプの定義、例外処理、メモリ管理に注意して、コードの堅牢性を確保してください。

See all articles