Mysql —— linux下使用c语言访问mySql数据库

示例1:
#include<stdio.h>
#include<mysql.h>
int   main()
{
MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, "host" , "user" , "passwd" , "database" ,0,NULL,0))
{
fprintf (stderr, "Failedtoconnecttodatabase:Error:%s\n" ,mysql_error(&mysql));
}
mysql_close(&mysql);
return   0;
}
示例2( linux下使用c语言访问mySql数据库 ):
1、联接数据库 (test需要提前创建好)
2、创建新的数据库(workdata)
3、创建user表
4、向表中插入信息 作为管理员的信息
5、使用sql语句查询表中的信息
/********************************************
 * 编译命令:gcc aa.c -lmysqlclient -o aa
 * 执行命令:./aa
 * ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql/mysql.h"

MYSQL *g_conn;//mysql 链接  
MYSQL_RES *g_res;//mysql 记录集  
MYSQL_ROW g_row;//字符串数组,mysql 记录行

const char *g_host_name = "localhost";
const char *g_user_name = "root";
const char *g_password = "asdfgh";
const char *g_db_name = "test";
const unsigned int g_db_port = 3306;

#define MAX_BUF_SIZE 1024 //缓冲区最大字节数
char sql[MAX_BUF_SIZE];
char Time[MAX_BUF_SIZE];

int iNum_rows = 0;//mysql语句执行结果返回行数赋初值  
int flag = 0;//管理员权限开关  
int i = 1;//系统运行开关  

/****************************************************
 * time : 20180622
 * addby : swj
 * function :print_mysql_error() 打印错误信息
 * ******************************************************/
void print_mysql_error(const char *msg)
{
	if(msg)
		printf("%s: %s\n",msg,mysql_error(g_conn));
	else
		puts(mysql_error(g_conn));
}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :executesql() 执行sql语句,成功返回0,失败返回-1 
 ******************************************************/
int executesql(const char * sql)
{
	if(mysql_real_query(g_conn,sql,strlen(sql)))
		return -1;
	return 0;
}
/****************************************************
 * time : 20180622
 * addby : swj
 * function :init_mysql() 初始化链接
 ******************************************************/
int init_mysql()
{
	//init the database connection 
	g_conn = mysql_init(NULL);
	//connection the database 
	if(!mysql_real_connect(g_conn,g_host_name,g_user_name,g_password,g_db_name,g_db_port,NULL,0))
		return -1;//链接失败
	if(executesql("set names utf8"))
		return -1;
	return 0; //返回成功
}
/****************************************************
 *  * time : 20180622
 *   * addby : swj
 *    * function :create_database()  选择数据库 没有的时候 创建数据;有的时候 进去数据
 *    库 
 * ******************************************************/
void create_database()
{
        sprintf(sql,"use workdata");
        if(executesql(sql) == -1)
        {
                puts("create database");
                executesql("create database workdata;");
                print_mysql_error(NULL);
                puts("choice database");
                executesql("use workdata;");
                print_mysql_error(NULL);
                puts("!!!Initialize the success!!!");
        }
        else
        {
                executesql("use workdata;");
                print_mysql_error(NULL);
        }

}
/****************************************************
 *  * time : 20180622
 *   * addby : swj
 *    * function :create_table()  创建表 
 * ******************************************************/
void create_table()
{
        sprintf(sql,"show tables;");
        executesql(sql);
        g_res = mysql_store_result(g_conn);
        iNum_rows = mysql_num_rows(g_res);
	if(iNum_rows == 0)
        {
                puts("create users table");
                executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");
        }
        mysql_free_result(g_res);//释放结果集 
}
/****************************************************
 *  * time : 20180622
 *   * addby : swj
 *    * function :init_administrator() 初始化管理员账户
 *     *               管理员用户名:root  密码:root
 *      * ******************************************************/
void init_administrator()
{
        sprintf(sql,"select * from users where id_='1' and name_='root';");
        executesql(sql);
        g_res = mysql_store_result(g_conn);
        iNum_rows = mysql_num_rows(g_res);
        if(iNum_rows == 0)
        {
                puts("Init Administrtor User");
                sprintf(sql,"insert into users values(1,'root','root','2017-08-18 12:21:11',1,0,'','','0:VIP 1:local pwd 2:local cert');");
                executesql(sql);
        }
        mysql_free_result(g_res);//释放结果集 
}
int main(void)
{
	puts("!!!The system is initializing!!!");
	/*初始化链接*/
	//在初始化的时候 数据库 test 是必须事先创建好的 否则会报错Unknown database 'test' 
	if(init_mysql())
		print_mysql_error(NULL);//当链接数据库时候 有错误 会报错
        //选择数据库workdata 没有的时候 创建数据库  有的时候 进去数据库
        create_database();	
	//创建表
        create_table();
        //初始化管理员账户
        init_administrator();
//操作数据库  查询数据库 表中的信息
	if(executesql("select  * from users"))
		print_mysql_error(NULL);
	g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 
        int iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
        int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数 
	printf("共%d个记录,每个记录%d字段\n", iNum_rows, iNum_fields);
	printf("id_  | name_ |password_| create_time_     |creator_id_ | auth_type_  |dyn_sn_| dyn_pass_sn_ |remark_  \n");
	while ((g_row=mysql_fetch_row(g_res))) // 打印结果集
        	printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5],g_row[6],g_row[7],g_row[8]); // 第一,第二字段
        mysql_free_result(g_res); // 释放结果集
	mysql_close(g_conn);
	return EXIT_SUCCESS;
}

执行结果显示
当直接编译.c文件的时候:
会出现
/tmp/ccp5dIsd.o:在函数‘print_mysql_error’中:
aa.c:(.text+0x1e):对‘mysql_error’未定义的引用
aa.c:(.text+0x48):对‘mysql_error’未定义的引用
/tmp/ccp5dIsd.o:在函数‘executesql’中:
aa.c:(.text+0x83):对‘mysql_real_query’未定义的引用
………………错误是因为没有进行编译
gcc aa.c -lmysqlclient -o aa

当test数据库没有事先创建好(Unknown database 'test'):
当test数据库事先创建好:
mysql_real_connect
中文名
数据库联接参数
外文名
mysql_real_connect
头文件
#include<mysql.h>
函数说明
运行MySQL数据库引擎建立连接





函数原型
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过 mysql_options ()调用,可更改多种连接选项。

“host”的值必须是 主机名 或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与 本地主机 的连接。如果操作系统支持 套接字 (Unix)或 命名管道 (Windows),将使用它们而不是TCP/IP连接到服务器。(host参数决定了联接的类型)

“user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的 登录名 。在Windows ODBC下,必须明确指定当前用户名。

“passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样, 数据库管理员 就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。

“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。

如果“port”不是0,其值将用作TCP/IP连接的 端口号 。注意,“host”参数决定了连接的类型。
如果unix_socket不是NULL,该字符串描述了应使用的 套接字 命名管道 。注意,“host”参数决定了连接的类型。

client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
标志名称
标志描述
CLIENT_COMPRESS
使用压缩协议。
CLIENT_FOUND_ROWS
返回发现的行数(匹配的),而不是受影响的行数。
CLIENT_IGNORE_SPACE
允许在函数名后使用空格。使所有的函数名成为保留字。
CLIENT_INTERACTIVE
关闭连接之前,允许interactive_timeout秒的不活动时间。
CLIENT_LOCAL_FILES
允许LOAD DATA LOCAL处理功能。
CLIENT_MULTI_STATEMENTS
通知服务器,客户端可能在单个字符串内发送多条语句。
CLIENT_MULTI_RESULTS
通知服务器,客户端能够处理来自多语句执行。
CLIENT_NO_SCHEMA
禁止 db_name.tbl_name.col_name 语法。
CLIENT_ODBC
客户端是ODBC客户端。它将 mysqld 变得更为ODBC友好。
CLIENT_SSL
使用SSL,该选项不应由应用程序设置,而是在客户端库内部设置。
对于某些参数,能够从选项文件获得取值,而不是取得mysql_real_connect()调用中的确切值。为此,在调用mysql_real_connect()之前,应与MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP选项一起调用 mysql_options ()。随后,在mysql_real_connect()调用中,为准备从选项文件读取值的每个参数指定“无值”值:
对于host,指定NULL值或 空字符串 ("")。
对于user,指定NULL值或空字符串。
对于passwd,指定NULL值。(对于密码,mysql_real_connect()调用中的空字符串的值不能被选项文件中的字符串覆盖,这是因为,空字符串明确指明MySQL账户必须有空密码)。
对于db,指定NULL值或空字符串
对于port,指定“0”值。
对于unix_socket,指定NULL值。
对于某一参数,如果在选项文件中未发现值,将使用它的默认值,如本节前面介绍的那样。





返回值
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同




  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容: 1、mysql——原始 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848259 存在的问题: 1、新增用户时候id ,删除后再增加会出错,id有冲突; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 2、db_修改过(用户 角色 权限) 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848780 修改的问题: 1、新增用户时候id 改为最大id值加一,之前用的select查看出来的记录数加一,删除后再增加会出错; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 4、修改了用户的表字段信息,新增了认证方式的字段; 5、用户有三种认证方式,当选择口令认证的时候,syn_sn_有输入信息,当选择KEY认证的时候,dyn_pass_sn_字段有输入信息 3、userGroupUser_intfac 文件: 博客的网址:https://blog.csdn.net/weixin_42167759/article/details/80848991 整理的文档: 《Mysql 最后程序的总结—— Linux系统C语言编程连接MySql数据库实现的用户角色权限管理系统》 修改的问题: 1、新增 添加用户组模块; 2、新增 显示用户组模块; 3、修改 新增用户模块 选择 其所属用户组 并把用户id与用户组id 写入用户用户组关系表; 4、新增 修改用户以及删除用户组模块(有用户属于该用户组 用户组名字不允许更改 用户组不允许删除); 5、新增 增加用户、用户组时候,若要增加的用户名已存在(给出用户存在的提示信息); 6、修改了 显示的界面问题; 7、修改部分switch case 输入为字符; 8、修改部分 操作完成后 有两次回车 确认的问题; 遗留的问题: 1、switch case 输入为字符,应该改为case a:bresk; case b:break;…… 否则输入的1与10是一样的执行结果; 字符中只有数字0-9; 2、在remark字段中 scanf()函数是不允许输入空格的。 __________________________________________________________________________________________________ 4、user-role-authoritys-usergroup文件: 数据库的图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值