C语言程序连接MySQL数据库教程及注意事项 - C语言

本文档详细介绍了如何在C语言中连接MySQL数据库,包括配置环境、设置项目属性、添加依赖库,以及解决64位系统下的链接错误。同时,讲解了关键函数如mysql_init(), mysql_real_connect(), mysql_store_result()等的用法,帮助开发者实现数据库的连接和查询操作。" 121077722,11577604,图十字链表:创建与遍历算法解析,"['数据结构', '图算法', '链表', 'C++']
摘要由CSDN通过智能技术生成

MySql 版本:MySql-5.6.16-winx64

VS版本:visual stadio 2010(以上)

1 首先确定一下MySql的安装路径

Mysql_install_path = E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64

我们只关心该目录下的includelib两个文件夹。

2.打开vs2010创建一个控制台项目 TestMySQL

①右键项目 ->属性->配置属性->C/C++ -> 常规 –>附件包含目录

 

编辑附加包含目录,将mysql_install_path目录下的include添加进来。

②新建一个C源文件。

输入:

#include <WinSock2.h>

#include “mysql.h”

#include <stdio.h>

#include <stdlib.h>

Int main()

{

      

System(“pause”);

Return 0 ;

}

保存该源文件。

编译连接。如果编译通过会在项目目录下产生一个debug目录(里面包含可执行程序)。该目录正是我们所需要的。

③将mysql_install_path目录下lib目录下的 libmysql.liblibmysql.dll拷贝到上一步产生的debug目录下(libmysql.dll要和可执行程序在同一个目录下)。

 

右键项目->属性->配置属性->VC++目录 -> 库目录。

编辑库目录,将源文件编译产生的debug目录的路径添加进来。



④ 右键项目->属性->配置属性->连接器->输入->附加依赖项。

编辑附加依赖项,添加libmysql.lib




然后修改源程序

#include <WinSock2.h>
#include "mysql.h"
#include <stdio.h>

#include <stdlib.h>
#define HOST "127.0.0.1"
#define PORT 3306
#define USR "root"
#define PWD "123456"
#define DB "test"
#define TABLE1 "student"
#define TABLE2 "account"
int main()
{
	MYSQL *con;
// 	char *myhost="127.0.0.1";
// 	char *myusr="root";
// 	char *mypwd="123456";
// 	char *mydb="test";
// 	char *mytable1="student";
// 	char *mytable2="account";
// 	int myport=3306;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char name[100]="liubin";
	char sql_line[1024]="";
	int rt,index_field,count;
	con = mysql_init((MYSQL *)0);
	if(!mysql_real_connect(con,HOST,USR,PWD,DB,PORT,NULL,0)) //mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接
	{
		printf("mysql connect failed !\n");           //连接失败返回NULL
		system("pause");
		exit(-1);
	}
	printf("connect successful!\n");
	//select * from student;
	sprintf(sql_line,"select * from %s where usr_name='%s' ",TABLE2,name);  //使用语句数组赋值   table2 table2是表的名字
	rt=mysql_real_query(con,sql_line,strlen(sql_line));  //  通过中间的的数组中的查询语句进行查询 参数 :MYSQL *mysql, const char *query, unsigned long length
	if (rt)   //
	{
		printf("mysql_real_query error !\n");
		system("pause");
		exit(-1);
	}
	else
	{
		res=mysql_store_result(con); //记录检索到的信息
		//printf("Insert successful!\n");
		//printf("Delete successful!\n");
		//printf("Update successful!\n");
		//count=0;

// 		row=mysql_fetch_row(res);
// 		printf("%s",row[1]);
		while(row = mysql_fetch_row(res))
		{
			//printf("|");
			for(index_field =0; index_field<mysql_num_fields(res);index_field++)
			{
				printf("%-10s|\t",row[index_field]);

			}
			printf("\n------------------------------------------------------------------------------\n");
			//count++;
		}
		//printf("total results : %d \n",count);
		mysql_free_result(res);
	}
	
	mysql_close(con);
	system("pause");
	return 0;
}

该程序是一个简单的链接数据库查询程序。


下面是一些报错情况解决, 上面教程兼容32系统, 但在64位系统下需要修改一些东西

64位系统通过上面的配置依然会报错:

报错会出 错误如下:
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_close@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_fetch_row@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_store_result@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_options@12,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用


解决方案:

第一步:

项目->属性->vc++目录。 "包含目录"中添加"E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64\include" 

若编译依然不通过,报错后 按照下面方法:

我使用的系统是win8x64,MySQL 64位的lib也是64位的接口。所以解决方法如下:
项目->属性->配置管理器     活动解决方案平台 (对话框右上角),win32处  下拉选新建,
出现一个新的对号框,在键入选择新平台中选择X64


然后F5运行一下   找到当前程序所在目录  
会生成一个新文件夹叫 X64 ,里面有一个新的Debug文件夹 , libmysql.lib libsql.dll放到新生成文件夹的Debug下 
然后重新运行程序  成功。




下面是一些程序用的函数或者变量的讲解:


真正的连接

定义MYSQL结构体变量

MYSQL *CON; 

然后是初始化连接

con = mysql_init((MYSQL *)0);

然后是真正的连接数据库

mysql_real_connect(con "HOST", "USR", "PWD", "DB", "PORT", 0, NULL);

第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。

注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。

定义sql语句(最后没有分号):

char sqlbuf[100] = "select * from student ";

sprintf(sql_line,"select * from %s  ",TABLE1);

下面让MySQL执行sql语句:

rt=mysql_real_query(con,sql_line,strlen(sql_line)); 

该函数也是成功(即使没有查询到数据)返回0,失败返回非0。

查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)

MYSQL_RES *res;

MYSQL_ROW row;  // 本质上就是二维数组

获取查询结果

res = mysql_store_result(con);

获取每一条记录

while (row = mysql_fetch_row(res))

{

       for(index_field =0; index_field<mysql_num_fields(res);index_field++)
{
printf("%-10s|\t",row[index_field]);
}

        // 添加自己的存储查询结果代码

}

释放查询结果:

mysql_free_result(res);

关闭MySQL连接:

mysql_close(con);

如果是INSERT、UPDATE等非查询语句mysql_real_query()就可以结束了,因为没有结果可存。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值