目录
例子
增、删、改代码:
返回数据的语句: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 Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MySQL的角色:Web应用程序中的数据库 MySQL的角色:Web应用程序中的数据库 Apr 17, 2025 am 12:23 AM

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。

notepad怎么运行java代码 notepad怎么运行java代码 Apr 16, 2025 pm 07:39 PM

虽然 Notepad 无法直接运行 Java 代码,但可以通过借助其他工具实现:使用命令行编译器 (javac) 编译代码,生成字节码文件 (filename.class)。使用 Java 解释器 (java) 解释字节码,执行代码并输出结果。

Linux的主要目的是什么? Linux的主要目的是什么? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服务器操作系统,2.嵌入式系统,3.桌面操作系统,4.开发和测试环境。Linux在这些领域表现出色,提供了稳定性、安全性和高效的开发工具。

sublime怎么设置快捷键 sublime怎么设置快捷键 Apr 16, 2025 am 09:15 AM

要设置 Sublime Text 的快捷键,请遵循以下步骤:打开快捷键设置文件 Key Bindings - User。使用 { &quot;keys&quot;: [&quot;按键组合&quot;], &quot;command&quot;: &quot;命令&quot; } 的格式添加快捷键设置。保存更改。重新加载快捷键设置以使更改生效。

git怎么查看仓库地址 git怎么查看仓库地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 仓库地址,请执行以下步骤:1. 打开命令行并导航到仓库目录;2. 运行 "git remote -v" 命令;3. 查看输出中的仓库名称及其相应的地址。

laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

如何设置重要的 Git 配置全局属性 如何设置重要的 Git 配置全局属性 Apr 17, 2025 pm 12:21 PM

自定义开发环境的方法有很多种,但全局 Git 配置文件是最有可能用于自定义设置(例如用户名、电子邮件、首选文本编辑器和远程分支)的一种。以下是您需要了解的有关全局 Git 配置文件的关键事项。

vscode怎样打多行注释 vscode怎样打多行注释 Apr 15, 2025 pm 11:57 PM

VS Code 多行注释的方法有:1. 快捷键(Ctrl K C 或 Cmd K C);2. 手动添加注释符号(/ /);3. 选择菜单(“Comment Block”);4. 使用扩展;5. 递归注释(/* /)和块注释({/ 和 /})。多行注释有助于提高代码可读性和可维护性,但应避免过度使用。

See all articles