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

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++ -> 常规 –>附件包含目录

 C语言程序连接MySQL数据库教程及注意事项 - C语言_第1张图片

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

②新建一个C源文件。

输入:

#include 

#include “mysql.h”

#include 

#include 

Int main()

{

      

System(“pause”);

Return 0 ;

}

保存该源文件。

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

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

 

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

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


C语言程序连接MySQL数据库教程及注意事项 - C语言_第2张图片

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

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

C语言程序连接MySQL数据库教程及注意事项 - C语言_第3张图片



然后修改源程序

#include 
#include "mysql.h"
#include 

#include 
#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

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


下面是一些报错情况解决, 上面教程兼容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{
printf("%-10s|\t",row[index_field]);
}

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

}

释放查询结果:

mysql_free_result(res);

关闭MySQL连接:

mysql_close(con);

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

下面是一下文件中用的函数的文档摘要:

参考MySQL shou手册API和库


mysql_init()

MYSQL *mysql_init(MYSQL *mysql)

描述

分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysqlNULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL

错误

在内存不足的情况下,返回NULL


mysql_real_connect()

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)

描述

mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。

参数的指定方式如下:

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

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

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

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


 mysql_real_query()

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

描述

执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句。

对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含\0’字符。此外,mysql_real_query()mysql_query()快,这是因为它不会在查询字符串上调用strlen()

如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查mysql_field_count()

返回值

如果查询成功,返回0。如果出现错误,返回非0值。

错误

·         CR_COMMANDS_OUT_OF_SYNC

以不恰当的顺序执行了命令。

·         CR_SERVER_GONE_ERROR

MySQL服务器不可用。

·         CR_SERVER_LOST

在查询过程中,与服务器的连接丢失。

·         CR_UNKNOWN_ERROR

出现未知错误。



 mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述

对于成功检索了数据的每个查询(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE),必须调用mysql_store_result()mysql_use_result() 

对于其他查询,不需要调用mysql_store_result()mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result()它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。

如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。

mysql_store_result()将查询的全部结果读取到客户端,分配1MYSQL_RES结构,并将结果置于该结构中。

如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。

如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。

如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。

一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。

可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()mysql_row_tell()来获取或设置结果集中的当前行位置。

一旦完成了对结果集的操作,必须调用mysql_free_result()

返回值

具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL

错误

如果成功,mysql_store_result()复位mysql_error()mysql_errno()

·         CR_COMMANDS_OUT_OF_SYNC

以不恰当的顺序执行了命令。

·         CR_OUT_OF_MEMORY

内存溢出。

·         CR_SERVER_GONE_ERROR

MySQL服务器不可用。

·         CR_SERVER_LOST

在查询过程中,与服务器的连接丢失。

·         CR_UNKNOWN_ERROR

出现未知错误。



mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述

检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL

行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。

可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。

返回值

下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL

错误

注意,在对mysql_fetch_row()的两次调用之间,不会复位错误。

·         CR_SERVER_LOST

在查询过程中,与服务器的连接丢失。

·         CR_UNKNOWN_ERROR

出现未知错误。



 mysql_num_fields()

unsigned int mysql_num_fields(MYSQL_RES *result)

要想传递MYSQL*参量取而代之,请使用无符号整数mysql_field_count(MYSQL *mysql)

描述

返回结果集中的行数。

注意,你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果mysql_store_result()mysql_use_result()返回NULL应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是SELECT语句(或类似SELECT的语句)。在下面的示例中,介绍了执行该操作的方式。

返回值

表示结果集中行数的无符号整数。

错误

无。



mysql_free_result()

void mysql_free_result(MYSQL_RES *result)

描述

释放由mysql_store_result()mysql_use_result()mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。

释放完成后,不要尝试访问结果集。

返回值

无。

错误

无。



 mysql_close()

void mysql_close(MYSQL *mysql)

描述

关闭前面打开的连接。如果句柄是由mysql_init()mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

返回值

无。

错误

无。








你可能感兴趣的:(C语言)