功能目录:
(一)建立和断开与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);