今日工作:
使用MYSQL客户端的api读取本地txt文档,传入远程MYSQL服务器端(实验)
收获:
1.mysql_autocommit(&sql, 0);//关闭自动提交
MYSQL在innodb引擎下可支持非自动提交,用于事务处理。如这次做的多次插入SMART数据,再一起commit,可大大提高写入 效率。
2.mysql_errno(&sql)//返回错误代码,mysql_error(&sql)//返回错误信息
3.fgets()函数按行读取文件或者数据流,linux下(编码格式为unix)读取文件时会保留最后的'\n',windows下(编码格式为dos)保留'\r''\n'。今天就因为把windows桌面上的txt文件直接rz到linux服务器下,未更改编码格式,导致fgets最后多出两个字符('\r''\n')
4.linux下最好不用sprintf,改用snprintf(buf,n,format,arg)防止溢出,其中n的大小保持与buf的大小一致即可,当format代表的源字符串大于n-1时,snprintf会截取前n-1个字符并把第n位写入'\0',小于n时直接读入,并在末尾加入'\0'
5.单线程环境下可以不写mysql_library_init(),因为mysql_init()已经做了同样的工作,但是要写mysql_library_end()以保证安全
6.SQL语句:清空某表的数据
truncate table table_name;
代码如下:
#include <stdio.h>
#include <string.h>
#include "mysql.h"
int main()
{
MYSQL sql;
mysql_init(&sql); //初始化MYSQL结构体
if (&sql==NULL)
{
printf("init errorn\n");
return 1;
}
//连接失败就打印具体的错误信息
用户为root@localhost, 密码是0126, 数据库是test
MYSQL*ConnectStatus=mysql_real_connect(&sql,"172.26.225.140","root","123456","SMARTINFO",0,NULL,0);
if(NULL==ConnectStatus)
{
printf("connect errorn\n");
printf("error:%d: %s\n",mysql_errno(&sql),mysql_error(&sql));
return 1;
}
printf("connect success\n");
mysql_autocommit(&sql, 0);//关闭自动提交
//result
MYSQL_RES*result=NULL;
//TRANSACTION
const int MAX_LINE=1024;
char sql_statement[MAX_LINE];
memset(sql_statement,0,sizeof sql_statement);
//insert into smart values('172.26.225.151')";
mysql_query(&sql,"START TRANSACTION");
//const int MAX_LINE=1024;
FILE*fp = NULL;
char buf[MAX_LINE];
memset(buf,0,sizeof buf);
if (NULL == (fp = fopen("dynamic_info.txt", "r")))
{
printf("open failed\n");
return -1;
}
while (NULL != fgets(buf, MAX_LINE, fp))
{
//printf("buf:%d %d %d\n",buf[6],buf[7],buf[8]);
buf[strlen(buf)-1]='\0';//用\0替换最后一个\n
//printf("buf:%d %d %d\n",bufi[6],buf[7],buf[8]);
//snprintf(sql_statement,
snprintf(sql_statement,MAX_LINE,"insert into smart(smartdata) values(\"%s\")", buf);
//printf("test2\n");
int status=mysql_query(&sql, sql_statement);
if (status)
{
printf("Could not execute statement(s)\n");
mysql_close(&sql);
exit(0);
}
}
mysql_query(&sql,"COMMIT");
printf("transaction end\n");
mysql_free_result(result);
mysql_close(&sql);
mysql_library_end();
return 0;
}