一切尽在代码中,代码中也太多了if/else,可以对它进行更好的函数及至类的封装,规范的处理好异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#include <windows.h> //需要在VC的Options设置一个include路径指向'%mysql_home%/inlude'目录 #include <mysql.h> //设置一个lib路径指向'%mysql_home%/lib/opt'目录 (mysql5.0是个目录) #pragma comment(lib,"libmysql.lib") #define host_name "localhost" //数据库服务器 #define db_name "test" //数据库名 #define user_name "root" //用户名 #define password "" //密码 <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-more="more" data-wp-more-text="" class="wp-more-tag mce-wp-more" alt="" title="Read more..." data-mce-resize="false" data-mce-placeholder="1"> int main(int argc,char * argv[]) { char szSqlText[500] ; MYSQL *conn; MYSQL_RES *rs; MYSQL_ROW row; //注意它的声明 typedef char **MYSQL_ROW,字符串数组 BOOL bCreate = FALSE; conn = mysql_init(NULL); if(conn == NULL) { fprintf(stderr,"mysql_init() failed (probably out of memory)\n"); exit(1); } if(mysql_real_connect(conn,host_name,user_name,password, db_name,MYSQL_PORT,NULL,0) == NULL) { //在MYSQL初始化之后的操作如果有错误,可以用mysql_errno(MYSQL*)和 //mysql_errer(MYSQL*) 分别获得出错代号和描述 fprintf(stderr,"mysql_real_connect() failed:\nError %u (%s)\n",mysql_errno(conn),mysql_error(conn)); exit(1); } printf("connect to db successful.\n"); if(bCreate){ //第一次运行创建一个表mytable sprintf(szSqlText,"create table mytable(time datetime,s1 char(6),s2 char(11),s3 int,s4 int)"); if(mysql_query(conn,szSqlText)) { printf("Can't create table.\n"); mysql_close(conn); return 0; } } sprintf(szSqlText,"insert into mytable values('2000-3-10 21:01:30','Test','MySQLTest',2000,3)"); if(mysql_query(conn,szSqlText)) { printf("Insert values error:\nError %u (%s)\n", mysql_errno(conn),mysql_error(conn)); mysql_close(conn); return 0; } else{ //insert/delete/update 语句可用mysql-affected_rows()得到受作用的行 printf("INSERT statement succeeded: %lu rows affected\n",(unsigned long)mysql_affected_rows(conn)); } //查询数据 sprintf(szSqlText,"select * from mytable"); //执行成功则返回零 if(mysql_query(conn,szSqlText) != 0) { mysql_close(conn); return 0; } else { //立即从服务器返回所有行,存储到本地,产生结果集,失败则返回NULL rs = mysql_store_result(conn); //结果集是保留在服务器上,fetch_row时才逐行从服务器上取 //rs = mysql_use_result(conn); //Get query result. int count = (int)mysql_num_rows(rs); printf("Query: %s.\n%ld records found.\n",szSqlText,count); //MYSQL_ROW是一个指向数值数组的指针,row[0],row[1]...row[列数-1] //所有的数据类型都以字符串返回,即使是数字型,要进行串转换 //NULL指针代表数据库字段的NULL,应经常检查列是否为NULL while((row = mysql_fetch_row(rs)) != NULL){ //返回NULL,则说明不再有行 for(unsigned int i=0; i<mysql_num_fields(rs);i++){ if(i>0) fputc('\t',stdout); printf("%s",row[i]!=NULL ? row[i]:"NULL"); } fputc('\n',stdout); } //使用完后,释放结果集占用内存 mysql_free_result(rs); } mysql_close(conn); return 0; } //最后,注意查询语句中字符串的转义 select a from t where a=''1',是要出错的 //空字符转换为'\0',这里的0 是可打印的ASCII 码0,而不是空。 //反斜线、单引号和双引号分别转换为‘\\’、‘\'’ 和‘\"’ //你也可以用mysql_escape_string(to_str,from_str,from_len)转换sql语句 |
输出结果是:
connect to db successful.
INSERT statement succeeded: 1 rows affected
Query: select * from mytable.
8 records found.
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
Press any key to continue
本文链接 https://yanbin.blog/vc-c-api-access-mysql/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
上面的代码是你原创的吗,哥们,连winsock.h的头文件都没有包含,
还弄个版权声明:
搞笑喔