在C++中使用MySQL

功能目录:

(一)建立和断开与MySQL的链接

(二)数据的常规查询

(三)把文件写入MySQL

(四)其他处理

===================================================================================

要调用MySQL接口,需要MySQL的libmysql.dll文件

这个可以在MySQL安装目录下找到。

编写代码时,别忘了把MySQL目录下的include和lib目录包含进去。

===================================================================================


(一)建立和断开与MySQL的链接

变量:

MYSQL *sock ---------------MYSQL为链接实体类型,与MySQL的交互需要使用它

const char* host-------------MySQL所在主机

const char* user-------------MySQL数据库用户名

const char* pass------------用户名对应密码

const char* db---------------数据库名

unsigned int port------------数据库端口,默认3306

调用接口:

 MYSQL*mysql_init(MYSQL* mysql) ------------------------初始化MySQL变量

MYSQL*mysql_real_connect(MYSQL *sock,const char* host,const char* user,

const char* pass,const char* db,unsigned int port,NULL,0)------------链接MySQL

  void mysql_close(MYSQL *sock) ---------------------------断开MySQL链接

                具体示例:

             

<span style="font-size:14px;">MYSQL* MySQLInitConn(const char* host,const char* user,const char* pass,const char* db,unsigned int port )
{
	MYSQL* sock = NULL;
	sock = mysql_init(NULL);
	if(sock &&mysql_real_connect(sock,host,user,pass,db,port,NULL,0)) 
	{ 
		cout<<"Connect Mysql Succeed!"<<endl; 
		mysql_query(sock,"set names gb2312;") ;//设置编码格式,否则在cmd下无法显示中文 
	}
	else
	{
		cout<<"Connect Database \" "<<db<<" \" failed"<<endl;
		cout<<mysql_error(sock)<<endl;
		mysql_close(sock);
		system("pause");
		exit(0);
	}
	return sock;
}</span>
int MySQLDisconn( MYSQL* sock )
{
	mysql_close(sock);
	return 1;
}



 

(二)数据的常规查询

变量:

MYSQL_RES* res; ---------查询的结果集MYSQL_ROW row; --------一条记录的内容,字段用row[0] ,row[1]..............表示,字段为一个字符串,可以进行常规转换,如atoi(row[0])

调用接口:

intmysql_query(MYSQL* sock,const char* sql)-----------------------运行sql语句

MYSQL_RES *mysql_store_result(MYSQL *sock)-----------------通过链接实体获取结果内容,保存在MYSQL_RES中

ulonglongmysql_num_rows(MYSQL_RES *res)---------------------获取结果有多少条记录,通常强制转换成int型

MYSQL_ROWmysql_fetch_row(MYSQL_RES *res) --------------获取结果集中的下一条记录,存储到MYSQL_ROW

voidmysql_free_result(MYSQL_RES *res) -------------------------释放结果集

                具体示例:

        string sqlString("SELECT * FROM table1");
	if(mysql_query(sock,sqlString.c_str()))
	{
		cout<<"Query Failed"<<endl;
		system("pause");
		exit(0);
	}
	res = mysql_store_result(sock);
	for (int i = 0;i<(int)mysql_num_rows(res);++i)
	{
		row = mysql_fetch_row(res);
		cout<<row[0];
        }
	mysql_free_result(res ); 



(三)把文件写入MySQL

调用接口:

 int mysql_real_query(MYSQL *sock, const char* sql, int length)------------写文件流必须用该接口

long mysql_real_escape_string(MYSQL *sock,const char *sql, char *buf, int n)-------获取转义SQL字符串

                具体实现:

        long size;
        int  n=0;
                FILE *fp; char *buf; char *sql; //定义变量
        struct _stat file_stats;
	if(_stat(path, &file_stats)) 
		return -1;
	size = file_stats.st_size;      //获取文件大小
                </strong>
		if ((buf = (char *)malloc(sizeof(char)*(size+1))) == NULL) { //根据文件大小分配一块缓存
			perror("malloc buf" ); 
			system("pause");
			return -1;
		}
		if ((fp = fopen(path, "rb" )) == NULL) { //打开文件
			perror("fopen file" ); 
			system("pause");
			return -1;
		}
		if ((n = fread(buf, 1, size, fp)) < 0) { //n=*size 把文件读入缓存 n为实际读取的大小
			perror("fread file" ); 
			system("pause");
			return -1;
		}
		sql = (char *)malloc(sizeof(char)*n*2+1); //2n+1+strlen(other sql) //这个大小是MySQL接口定义的,具体情况请参考MySQL手册
		if (sql == NULL) { 
			perror("malloc sql" ); 
			system("pause");
			return -1;
		}
	mysql_real_escape_string(sock, sql, buf, n);//获取转义SQL字符串
	sqlString.assign("INSERT INTO table1(file) VALUES(");
	sqlString +="\"";
	sqlString +=sql;
	sqlString += "\")";

	if(mysql_real_query(sock, sqlString.c_str(), sqlString.length())) 
	{ 
		cout<<mysql_error(sock)<<endl; 
		return -1;
	}


注意:

①写入文件时,需要把存放数据的字段类型设置为longblob,之后导出文件时只需右键选择导出。

②本方法也适用于内容为文本的文件,这时候可以存入varchar类型的字段中,这样在数据库中就可以显示为其中的内容。

(四)其他处理

初次使用时可以mysql_query(sock,"set names gb2312;") ;//设置编码格式,否则在cmd下无法显示中文 

②从数据库中读取出文本后,写入到文件里,有时候会遇到“未识别的文件尾”这种错误。

各个系统换行的文件尾不同,unix系统下是\n,mac系统下是\r,windows下是\r\n,有时编码问题会导致不同的文件尾。

而数据库的编码设置比较繁琐复杂,如果没有全部设置正常,有时候会发生“明明数据库中的内容是\r\n结尾,输出到文件后就成了\r或者\n”。

所以可以在输出到文件后,进行以下处理,使之适合windows。(以\r为例,\n同理)

        //以下代码把\r换行符换成win下的\r\n
	FILE *f;
	int c1,c2;
	f=fopen(path,"rb+");
	if (NULL==f) {
		printf("Can not open file\n");
		return 0;
	}
	while (1) {
		c1=fgetc(f);
		if (EOF==c1) break;
		if ('\r'==c1) {
			c2=fgetc(f);
			if (EOF==c2) {
				fseek(f,-1L,SEEK_CUR);
				fputc('\n',f);
				break;
			}
			if ('\n'!=c2) {
				fseek(f,-2L,SEEK_CUR);
				fputc('\n',f);
				fseek(f,1,SEEK_CUR);
			}
		}
	}
	fclose(f);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值